【问题标题】:Android TextView text not updating during runtimeAndroid TextView 文本在运行时未更新
【发布时间】:2010-09-03 19:21:31
【问题描述】:

我必须错过一些完全愚蠢的东西,因为更新 TextView 应该是一件容易的事。我有一个 Activity 类,它是另一个接收消息的观察者。在我的 Activity 的 onCreate 中,我执行以下操作,它工作正常。

theStatus = (TextView) findViewById(R.id.theStatus);
theStatus.setText("waiting");

稍后,当消息活动收到一条新消息时,它会将其交给它的观察者(我的活动)

public void statusUpdate( GenericMessage aMessage )
{
    String statusText = aMessage.getDetails();
    theStatus.setText(statusText);

    theSessionStatus.invalidate();  // I've tried with and without this call
}

但是屏幕没有更新。我一定是忽略了什么……

【问题讨论】:

  • 你确定statusUpdate() 甚至被调用了吗?
  • 我确定正在调用 statusUpdate。我正在使用调试器并捕获我在那里设置的断点。我现在意识到可能会影响我的一个细节是这个 Activity 不是应用程序的主要 Activity。短篇故事是主应用程序启动并等待用户单击按钮启动。一旦启动,它就会启动消息线程,并根据来自它的消息决定向用户显示什么活动。它通过调用 startActivityForResult 来启动这个 Activity,然后 Activity 将自己注册为消息线程的观察者。
  • 您应该确保正在进行的活动处理 statusUpdate() 调用。
  • 我已经确定 statuUpdate() 被调用了。正如我在之前的评论中所说,我正在使用调试器。我可以跳过 setText 调用并查看变量属性中的文本,但屏幕没有更新。
  • 我猜 Karan 的意思是应该在 UI 线程上调用 statusUpdate。您是否尝试过在主要活动中更新 TextView

标签: android android-widget


【解决方案1】:

看起来我找到了一个解决方案,虽然感觉像是一个 hack。我从上面的 cmets 和 here 那里得到了这个想法。

我现在使用 Handler 来通知 Activity B 有一条它感兴趣的消息进来了。B 在其 onCreate 中创建了一个 Handler:

  Handler statusHandler = new Handler();
  statusHandler.post(new Runnable() 
  {
      public void run()
      {
         statusUpdate();
      }
  });

我更新了消息接收器类 C(B 试图成为其观察者)以在 B 注册时接收 Handle。然后在 C 中,当适用的消息进来时,我调用以下命令:

theMsgObserverHandle.post(new Runnable()
{
   public void run()
   {
      Log.d(myName, "Calling my Observer statusUpdate");  

      theMsgObserver.statusUpdate();
   }
});

我不喜欢的是现在我不能直接将我的消息传递给 B。 (我的消息类是我自己定义的类而不是 android.os.Message) 现在在 B 中,我需要向 C 的实例(C 是单例)询问消息。但至少我在前进。如果有人有更好的实现,我将非常感谢您的反馈。

【讨论】:

  • 奇怪,在进一步阅读时,我似乎不必调用我的 onCreate 中的第一个 statusHandler.post,但如果我把它拿出来,同时调用 statusUpdate 并且不再抛出异常 setText 不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多