2015-01-08 95 views
2

我有一個的EditText和一個TextView的,我想更新我在每個迭代的TextView(ConsoleWindow在一個循環中運行,它會從一個處理函數中調用,從而在UIthread正在運行)。安卓的TextView沒有更新

的問題是,我的TextView只在第一輪被更新,然後持續了運行時的其餘部分中的第一項(雖然dataString是一個不同每輪):

private void ConsoleWindow(String dataString) { 

      LinearLayout layout = new LinearLayout(getApplicationContext()); 

      if (first2) { //first2 is true when application is launched 
       // ONLY SET LAYOUT AND EDITTEXT IN FIRST RUN TO SAVE CAPACITY 

       // LINEAR LAYOUT 
       setContentView(layout); 
       layout.setOrientation(LinearLayout.VERTICAL); 
       layout.setBackgroundColor(Color.parseColor("#000000")); // black 

       // EDITTEXT 
       EditText et = new EditText(getApplicationContext()); 
       et.setHint("Enter Command"); 
       layout.addView(et); 
       first2 = false; 
      } 


      // TEXTVIEW 
      TextView tv = new TextView(getApplicationContext()); 
      tv.setText(dataString); // KEEPS THE SAME UNTIL THE 1ST ROUND 
      layout.addView(tv); 
} 

我已經嘗試過tv.invalidate()和tv.postInvalidate(),但是這並沒有產生效果。請有人幫助我嗎?

+2

你難道沒有拿到TextView的更新,您可以創建一個新的 – tyczj

+0

問題是,我不能把'新TextView'的if語句,否則'tv.setText(...)'無法執行(因爲其外部if語句的) – blackst0ne

+2

你應該使用'新TextView'任何地方,因爲這就是一個'NEW' TextView的,而不是你正在更新 – tyczj

回答

1

把電視全局變量。

private TextView tv; 

在此之後,在你的 「的onCreate()」 方法:

tv = new TextView(getApplicationContext()); 

然後:

private void ConsoleWindow(String dataString) { 

      LinearLayout layout = new LinearLayout(getApplicationContext()); 

      if (first2) { //first2 is true when application is launched 
       // ONLY SET LAYOUT AND EDITTEXT IN FIRST RUN TO SAVE CAPACITY 

       // LINEAR LAYOUT 
       setContentView(layout); 
       layout.setOrientation(LinearLayout.VERTICAL); 
       layout.setBackgroundColor(Color.parseColor("#000000")); // black 

       // EDITTEXT 
       EditText et = new EditText(getApplicationContext()); 
       et.setHint("Enter Command"); 
       layout.addView(et); 
       first2 = false; 
      } 


      // TEXTVIEW 
      tv.setText(dataString); // KEEPS THE SAME UNTIL THE 1ST ROUND 
      layout.addView(tv); 
} 

請覈實過,如果dataString有一些文字,像這樣的東西

Log.d(TAG , "dataString: " + dataString + "with first time? " + first2.toString()); 

試着通過t他setContentView(佈局);在if語句之外。因爲我無法理解你爲什麼需要這個。

LinearLayout layout = new LinearLayout(getApplicationContext()); 
    setContentView(layout); 
+0

耶士終於成功了!我無法相信我在這麼簡單的事情上投入了太多時間^^謝謝! – blackst0ne

+0

是第一個解決方案嗎? :) – rguerra

+0

nope,已經有一個;但是那個不適用於這些聲明 – blackst0ne

1

first2false,你只是創建一個新的的LinearLayoutlayout然後不充氣layout,你是直接添加的TextViewtvlayout。這就是爲什麼Textvie瓦特是不可見的。

private void ConsoleWindow(String dataString) { 
    LinearLayout layout; 
    TextView tv; 
    EditText et; 

    if (first2) { 
     layout = new LinearLayout(getApplicationContext()); 

     setContentView(layout); 
     layout.setOrientation(LinearLayout.VERTICAL); 
     layout.setBackgroundColor(Color.parseColor("#000000")); 

     // EDITTEXT 
     et = new EditText(getApplicationContext()); 
     et.setHint("Enter Command"); 
     layout.addView(et); 

     tv = new TextView(getApplicationContext()); 
     layout.addView(tv); 

     first2 = false; 
    } 
    if(tv != null) { 
     tv.setText(dataString); 
    } 
} 
+0

感謝你的幫助,但還是同樣的問題-.- – blackst0ne