2016-04-10 60 views
0

我在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。
无论如何,谢谢大家的帮助。

+0

您是否尝试过用充气主办活动的上下文中的视图中的文本?我看到你正在使用应用程序上下文,而这可能不会给你你想要的。 – Benstrom

+0

嗨,它解决了,还是还有一些问题呢? –

回答

1

这可能是试图在时间刻度更新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(); 
} 
1

你不需要每次膨胀的观点,你必须改变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); 

} 
+0

我试过了,但不幸的是它不起作用,因为在changeNick方法中这个引用是空的,我得到了NullPointerException。正如我写的,changeNick方法是从另一个类调用的,这是另一个线程,所以需要runOnUiThread。 – Sebastian

+0

如果我在xml布局文件中使用相同的id,TextView的id如何可能不正确?正如我在编辑中写到的,我发现我的方法在'onCreate()'执行完成之前被其他线程提前调用,我认为它会导致问题。现在我正在寻找如何避免它。 – Sebastian

+0

以及如何在oncreate()之前调用该方法?你从哪里打来的..?如果在通话发生的地方显示整个代码,那会更有帮助 –

0

只需使用以下行来设置文本:

textView.setText(nick); 

没有必要改变UI-Thread