【问题标题】:TextView.setText() not workingTextView.setText() 不工作
【发布时间】:2013-02-27 16:32:29
【问题描述】:

我有这段代码...

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 线程上运行...

关于我可能做错了什么有什么想法吗?

干杯, 亚历克斯

【问题讨论】:

  • 忘了提到当我重新创建活动时,我得到的文本是布局中的默认文本......
  • 发布你是如何连接/分离处理程序的。
  • 事实证明你是对的。我通过处理程序的方式产生差异。我在创建服务时传递了它。现在我每次绑定时都将它作为replyTo参数传递并且它可以工作

标签: android textview handler settext


【解决方案1】:

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

如果 class IncomingHandler 是 Activity 的子类,那么确保在 onCreate() 期间确保使用 totalTextView = (TextView)findViewById(R.id.__/* something */__); 更新它应该很容易

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

ps.:有些用户会告诉你通过在清单中添加configChanged 来覆盖 Activity 的销毁。虽然它可能在第一时间起作用,但它不是一个快速修复,这是一种不可取的模式,通常会在未来导致更大的问题。

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

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

【讨论】:

  • 正如 dymmeh 在我的帖子中评论的那样,如何将处理程序传递给服务很重要。我的猜测是我的服务知道一个与重新创建的活动不再有任何关系的处理程序。
  • 非常感谢!我使用的是 Kotlin 自动生成的 this.text_field,所以对我来说,这个引用会变得不同步并不明显。
【解决方案2】:

由于 lint 建议处理程序应该是静态的,使处理程序静态并为活动创建一个weakReference,然后通过活动引用访问文本视图,我认为它应该可以工作

【讨论】:

    【解决方案3】:

    尝试保存实例 添加这个

    @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());
     }
    

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多