TextView.setText()不起作用

时间:2013-02-27 16:32:30

标签: android textview handler settext

我有这段代码......

class IncomingHandler extends Handler
{
    @Override
    public void handleMessage(Message message) 
    {

        String totalReceived = (String) message.obj;
        Log.i("TAG", "total received: " + totalReceived);
        totalTextView.setText("" + totalReceived);

        Log.i("TAG", (Looper.getMainLooper().getThread() == Thread.currentThread()) ? "UI thread" : "NOT UI thread");
        //Toast.makeText(MainActivity.this, "message received.", Toast.LENGTH_LONG).show();

    };
};

我运行我的应用程序并且它工作正常,但如果我重新创建活动,例如通过更改设备方向,文本将不会更新。请注意,我确实收到了消息,并且它们由LogCat成功打印。

另请注意,在我的上一次日志中,我尝试确定我是否在主线程上运行。如果检查是正确的,我确实在UI线程上运行......

关于我可能做错的任何想法?

干杯, 亚历

3 个答案:

答案 0 :(得分:0)

因为lint建议处理程序应该是静态的,使处理程序静态并为活动创建weakReference然后通过活动引用访问textview,我认为它应该工作

答案 1 :(得分:0)

尝试保存实例 添加这个

@Override
protected void onSaveInstanceState(Bundle outState) {
State s = new State(yourTextView.getText().toString());
outState.putSerializable(State.STATE, s);
super.onSaveInstanceState(outState);
 }
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
State s = (State) savedInstanceState.getSerializable(State.STATE);
yourTextView.setText(s.getYourTextViewText());
 }

答案 2 :(得分:0)

您的问题是totalTextView仍然指向(现已销毁的)之前活动的TextView。

如果class IncomingHandler是活动的子类,那么确保在onCreate()期间确保使用totalTextView = (TextView)findViewById(R.id.__/* something */__);

更新它是一项轻松的工作

如果处理程序不是Activity的子类,那么也许它应该是,或者您应该查看更多Android-Framework-High-Level内容来更新和回调Activity(例如Loaders或UI-使用setRetainInstance(true);

的碎片更少

ps:有些用户会告诉您只需将configChanged放入清单中即可覆盖活动的销毁。虽然它可能在第一时间起作用,但这是一个糟糕的快速修复,这是一种不可取的模式,通常会在未来导致更大的问题。

来自:http://developer.android.com/guide/topics/manifest/activity-element.html#config

  

注意:应避免使用此属性,并仅将其用作   最后一招。有关更多信息,请阅读处理运行时更改   关于如何正确处理由于配置更改而导致的重启。