2016-03-01 82 views
0

我已将TextView添加到RelativeLayout,我已将其添加到SurfaceView。我可以让TextView在我的SurfaceView上显示文字。从线程更新TextView中的文本

rl = new RelativeLayout(this); 
tv = new TextView(this); 
tv.setText(Integer.toString(GameScreen.score)); 
tv.setTextSize(50); 
tv.setPadding(390, 50, 0, 0); 
tv.setTextColor(Color.BLACK); 
rl.addView(renderView); 
rl.addView(tv); 
setContentView(rl); 

然后在我的GameScreen类的更新方法,我把:

game.getTextView().setText(Integer.toString(score)); 

,它给我的错误:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

我能做些什么来解决这个问题?

+2

的可能的复制[Android的 - ViewRootImpl $ CalledFromWrongThreadException(http://stackoverflow.com/questions/10118301/android-viewrootimplcalledfromwrongthreadexception) – rkosegi

+0

感谢rkosegi我读了它,但是从ANKIT解决方案做了一些感觉,但我直到@MustansarSaeed解释它不明白它 – Noitidart

+0

可能重复的[Android的更新TextView在线程和运行](http://stackoverflow.com/questions/12716850/android-update-textview-in-thread-and-runnable) – OnePunchMan

回答

2

使用是对UiThread

game.getTextView().post(new Runnable() { 
       @Override 
       public void run() { 
        game.getTextView().setText(Integer.toString(score)); 
       } 
      }); 

希望这有助于更新Widget推荐的方法如下。

+0

非常棒谢谢你!这工作!它帮助我了解@ankit的解决方案! – Noitidart

1

在UI线程中运行您的代码。您不能从工作线程执行UI操作。

your_context.runOnUiThread(new Runnable() { 
    public void run(){ 
     game.getTextView().setText(Integer.toString(score)); 
    } 
}); 
+0

感谢您的快速回复,这个解决方案是正确的,但直到我看到下面的@Must解决方案对我来说没有意义。但绝对投票,非常感谢你! – Noitidart

1

使用这个peice代码..确保它会帮助你!

private void runThread() { 

    new Thread() { 
     public void run() { 

       try { 
        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          game.getTextView().setText(Integer.toString(score)); 
         } 
        }); 

       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

     } 
    }.start(); 

让我知道它是否工作! :)

+0

谢谢Vivek! @Must下面的解决方案工作,但这有助于我学习,我真的很感激它! – Noitidart

+1

我很高兴这为你工作! :)干杯! –