Android runOnUiThread不更新布局元素
我在Android应用程序中遇到问题:
我试图动态更新TextView中的文本,但UI中没有更改。当我检入代码时(例如通过显示Toast或在调试器中),如果文本已经改变,它就会有,但GUI不会更新。
这里是我的代码:Android runOnUiThread不更新布局元素
<TextView
android:id="@+id/textViewNick"
android:gravity="bottom|left"
android:layout_height="wrap_content"
android:layout_width="match_parent" />
public void changeNick(final String nick)
{
this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
View view = View.inflate(MyApplication.getAppContext(), R.layout.activity_nick, null);
TextView textViewNick = (TextView) view.findViewById(R.id.textViewNick);
textViewNick.setText(nick);
}
});
}
的changeNick()
方法是从另一个类调用。
有谁知道为什么是这样以及如何解决它?提前致谢。
编辑
我发现了changeNick()
方法之前活动的onCreate()
调用。我在onCreate()
中添加了一个标志作为最后一条指令,我在调用changeNick()
之前检查了它,但它没有帮助,但仍然得到IllegalStateException“系统服务在onCreate()之前不可用于活动”。
解决
的changeNick()
方法之前活动的onCreate()
是所谓的,因为我有这样的活动的两个不同的实例。我正在对尚未创建的那个执行`changeNick(),所以我得到了NullPointerException。
无论如何,谢谢大家的帮助。
这可能是试图在时间刻度更新TextView
时,做这样的工作,我面临同样的问题,
public void changeNick(final String nick)
{
View view = View.inflate(MyApplication.getAppContext(), R.layout.activity_nick, null);
TextView textView = (TextView) view.findViewById(R.id.textViewNick);
new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(nick);
}
});
}
}).start();
}
你不需要每次膨胀的观点,你必须改变text.if你正在使用activity,初始化onCreate()
方法中的视图,然后更新view.You不需要runOnUiThread,因为你没有从任何后台线程更新。你可以直接更新视图。为你。
public class MyActivity extends Activity{
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_activity);
textView = (TextView) findViewById(R.id.textViewNick);
}
public void changeNick(final String nick) {
textView.setText(nick);
}
我试过了,但不幸的是它不起作用,因为在changeNick方法中这个引用是空的,我得到了NullPointerException。正如我写的,changeNick方法是从另一个类调用的,这是另一个线程,所以需要runOnUiThread。 – Sebastian
如果我在xml布局文件中使用相同的id,TextView的id如何可能不正确?正如我在编辑中写到的,我发现我的方法在'onCreate()'执行完成之前被其他线程提前调用,我认为它会导致问题。现在我正在寻找如何避免它。 – Sebastian
以及如何在oncreate()之前调用该方法?你从哪里打来的..?如果在通话发生的地方显示整个代码,那会更有帮助 –
只需使用以下行来设置文本:
textView.setText(nick);
没有必要改变UI-Thread
您是否尝试过用充气主办活动的上下文中的视图中的文本?我看到你正在使用应用程序上下文,而这可能不会给你你想要的。 – Benstrom
嗨,它解决了,还是还有一些问题呢? –