2 myshining MyShining 于 2016.03.13 09:25 提问

Android利用单例模式更改控件的属性,无法实现的问题

这是MainActivity中的代码,主要是加粗部分的代码,本打算通过Button的Onclick方法,来调用单例里边的Txtchange方法,来改变TextView的text,但是就是不法实现,求大神指点

package com.example.controlproject0311;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.os.Build;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // setContentView(R.layout.activity_main);
    RelativeLayout mainLayout = new RelativeLayout(this);
    mainLayout.setId(11);
    setContentView(mainLayout);
    Button button = new Button(this);
    button.setId(20);
    button.setText("hello");
    button.setTextSize(40);
    button.setTranslationX(50);
    button.setTranslationY(60);
    mainLayout.addView(button);

    final TextView txtView = new TextView(this);
    txtView.setText("one");
    txtView.setId(12);
    mainLayout.addView(txtView);

    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // SingletonControl.getInstance().txtChange();
            Singleton2.getInstance().sayhello();
            ****Singleton2.getInstance().SetText(txtView.getId());
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}


这是单例的代码

package com.example.controlproject0311;

import android.app.Activity;
import android.widget.TextView;

public class Singleton2 extends Activity {
/* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */
private static Singleton2 instance = null;

/* 私有构造方法,防止被实例化 */
private Singleton2() {
}

/* 1:懒汉式,静态工程方法,创建实例 */
public static Singleton2 getInstance() {
    if (instance == null) {
        instance = new Singleton2();
    }
    return instance;
}

public void sayhello() {
    System.out.println("are you ok");
}

public void SetText(int id) {
    TextView textView = (TextView) findViewById(id);
    textView.setText("weew");
}

}


2个回答

dongfeng9ge
dongfeng9ge   Ds   Rxr 2016.03.14 09:32

没发现Txtchange方法

MyShining
MyShining 东风哥,我的错,是setText()方法
接近 2 年之前 回复
dengyaoning
dengyaoning   2016.03.14 15:03

首先不得不吐槽一下这样的写法,有点难以接受;
其次我猜测问题应该出在Singlton2的SetText方法中,注意此方法中的findViewById的引用者是Singlton2类型,
mainActivity中创建的TextView是在mainLayout上,而mainActivity setContentView(mainLayout),所以
要找到你想要的TextView,传进去的应该是MainActivity的实例。
可以这么写:
public void SetText(Activity activity ,int id) {
TextView textView = (TextView) activity.findViewById(id);
textView.setText("weew");
}
或是
public void SetText(View rootView ,int id) {
TextView textView = (TextView) rootView.findViewById(id);
textView.setText("weew");
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!