Android中的TextView的setText方法有时不起作用

Jason_Y 发布于 2013/10/09 16:02
阅读 33K+
收藏 0

大家好,我现在在Android2.3下开发应用程序出现了这么一个问题。在一个Activity中有一个TextView控件,这个控件我在当前activity的xml里给其赋予了值,比如说是“当前组为XXXXX”

于是最开始的时候这个activity中文本框显示的是当前组为XXXXX。好啦,我在别的java文件中发送消息给这个activity想着更新这个文本框,于是activity接到消息后,

case MyApp.WM_CURRENTGROUP:   
        TextView textViewCurrentGroup = (TextView)findViewById(R.id.standby_textView1);
         CharSequence text = "当前组为"+CCallControl.gID;
         Log.i(TAG, "当前组是"+CCallControl.gID);
         textViewCurrentGroup.setText(text);
         textViewCurrentGroup.invalidate();
break; 

我log输出的结果为 当前组为1111,

可是我的UI界面上有时候确实是显示的为 当前组为1111

但是有的时候我的log输出了正确的信息,界面上依然显示的是 当前组为XXXXX

这是怎么回事呢,有知道的么?

加载中
0
我是一名程序员
我是一名程序员
这是确定在可以操作ui的线程上操作的吗
Jason_Y
Jason_Y
谢谢您帮助我。我是在自己建立的一个线程里发送消息,然后主线程接收到消息后做出响应。我看到消息的发出是正常的,主线程也能借到这个消息,然后程序会执行到我提到的那个case程序段。 您提到的是不是在可操作ui的线程上操作的,我觉得是。因为我有时候是可以看到那个textview改变的,但是有的时候就是没改变。一旦我离开这个界面,然后再跳转到这个界面时,我就发现这个textview的内容改变了。
0
marktola
marktola

给详细的代码吧, 感觉是应该先收到消息,但是解析xml在后面~ 有没有这种可能?

还有invalidate();有什么意义?

Jason_Y
Jason_Y
评论里占不下那么多字,您看我下面对您的回复吧。谢谢了。
0
Jason_Y
Jason_Y
解析XML在前面。具体代码结构如下
public class StandByActivity  extends Activity  {
...//初始化等等
  public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     
...//一些代码
       setContentView(R.layout.standby); 
//...一些处理代码
//开启主线程的消息队列
        activityHandler = new Handler(){
@SuppressLint("HandlerLeak")
public void handleMessage(Message msg) {     
        Intent intent = new Intent();
        switch(msg.what)
        {
        ...//一些分支语句
        case MyApp.WM_CURRENTGROUP:  
            TextView textViewCurrentGroup = (TextView)findViewById(R.id.standby_textView1);
            CharSequence text = "当前组为"+CCallControl.gID;    
             textViewCurrentGroup.setText(text);
             textViewCurrentGroup.setTextColor(0xffff00ff);
             Log.i(TAG, "当前组是"+CCallControl.gID);
             textViewCurrentGroup.invalidate();

break;

...//剩余部分代码

invalidate();我以为我的textview内容不变是有时候android UI未刷新的缘故。invalidate();这个可以刷新控件。但是现在还是有时候控件内容显示变了,但是有时候不变。虽然显示的没有变,但是通过log信息可以看到输出,本质确实是变了,但是显示出来的还是原来的。

0
猎户座
猎户座
表示从来没遇到过
Jason_Y
Jason_Y
呵呵,最好mark一下,我自己在网上找了好久,呵呵,有的人也是遇到过的。多交流,呵呵。
0
marktola
marktola
CCallControl.gID 是常量吗? 还有在哪sendmessage了? 是自己的测试代码吗? 如果测试代码,给一份给我吧,我看看
Jason_Y
Jason_Y
再次感谢您的帮助。现在这个问题我找了好久资料,最好按照下面第二楼的方法给解决了。
0
Jason_Y
Jason_Y

CCallControl.gID这个是一个静态的量,算是个全局的变量吧。我再发一下发送消息的代码。

我的程序不是测试代码,不好意思,不能发给你工程。

public void analyzeCTGS(String str){
StandByActivity.activityHandler.sendMessage( StandByActivity.activityHandler.obtainMessage(MyApp.WM_CURRENTGROUP)  );
Log.i(TAG, "发送组"+CCallControl.gID+"设置消息");
}
这里也有log信息输出,显示着CCallControl.gID已经是我要的值了。
0
叛教者尤里安
叛教者尤里安
case MyApp.WM_CURRENTGROUP:   
            TextView textViewCurrentGroup = (TextView)findViewById(R.id.standby_textView1); 
            CharSequence text = "当前组为"+CCallControl.gID;     

             textViewCurrentGroup.setText(text); 


问题在这里,你每次接收到消息之后就重新new了一下你的textView,这是不对的,你执行setText的textview和你界面上显示的textview已经不是同一个了.

TextView textViewCurrentGroup = (TextView)findViewById(R.id.standby_textView1); 把这行代码移到Handler外面去.

Jason_Y
Jason_Y
今天发现,这个方法还是有的时候没有更新。我确实是放在了那个的上面,不是每次都new了啊。
Jason_Y
Jason_Y
谢谢你的帮助,呵呵。我试了试,真的是没有问题。谢谢。
0
Jason_Y
Jason_Y

我最终的解决方法:

1.public class StandByActivity  extends Activity  implements Runnable {

既让activity继承一个runnable

2.接到消息后

case MyApp.WM_CURRENTGROUP:  
        activityHandler.post(StandByActivity.this);
break;

其实就是调用本activity的activityHandler.post,启动run函数。

3.run函数如下:

 public void run() {
  TextView textViewCurrentGroup = (TextView)findViewById(R.id.standby_textView1);
  CharSequence text = "当前组为"+CCallControl.gID;    
textViewCurrentGroup.setText(text);
textViewCurrentGroup.invalidate();
activityHandler.postDelayed(this, 1000);
  }

这样一来,因为是屡次执行的,所以肯定是可以刷新了。

这个是我最终的代码,有细枝末节的和最开始发的不太一样了,但是框架相同。


再次感谢大家的热心帮助,谢谢。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部