2016-03-01 119 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

我很高興這爲你工作! :)乾杯! –