2011-04-21 21 views
0

我以編程方式創建佈局,並且需要添加一個TextView。唯一的問題是,我需要使TextView成爲一個全局變量,因此可以在不同的方法中訪問它(需要在別處調用setText()方法)。以編程方式添加到Android佈局 - 然後訪問從另一個方法創建的內容

ScrollView scroll = new ScrollView(this); 
LinearLayout linear = new LinearLayout(this); 
linear.setOrientation(LinearLayout.VERTICAL); 
scroll.addView(linear); 

TextView time = new TextView(this); 
time.setText("Some text"); 
linear.addView(time); 

new CountDownTimer(30000, 1000) { 
public void onTick(long millisUntilFinished) { 
    time.setText("seconds remaining: " + millisUntilFinished/1000); 
} // 'time' not accessible 

public void onFinish() { 
time.setText("done!"); 
} 
}.start(); */ 

this.setContentView(scroll); 

所以我的問題是我創建'時間'TextView但CountDownTimer方法無法訪問它。我嘗試使用構造函數的TextView time = new TextView(this);作爲全局代碼,但是這會導致異常 - 「無法實例化活動ComponentInfo」和「空點異常」。這個例外並不表示哪條線特別引起問題,但確實是TextView timeLeft = new TextView(this);

+0

爲什麼不使用XML佈局文件來定義視圖?只是好奇。 – Squonk 2011-04-21 17:18:26

+0

另外,在你的代碼中你調用了setContentView? – Squonk 2011-04-21 17:28:04

+0

這只是代碼的一部分(我遇到問題的部分)。我之前以編程方式創建佈局作爲不確定數量的按鈕的原因被添加到它之前。 setContentView是(如上所述),位於每個按鈕後面的代碼底部,並將'time' TextView添加到佈局中。 – james246 2011-04-21 17:33:08

回答

1

我會在您的活動中創建一個成員變量(mTime)。然後CountDownTimer將能夠隨時訪問成員變量。

或者,你可以聲明time決賽:

final TextView time = new TextView(this); 
+0

現在通過將'time'聲明爲'final'來完成它,可以這樣做嗎? 'time'被修改,每當計時器滴答下來,因爲它是一個倒數計時器。我對於最終變量的作用有些困惑,因爲它似乎很高興地修改它。更好地得到維基百科,並閱讀我想! – james246 2011-04-21 17:27:54

0

你可以指定一個id(比如:myTextViewId)您TextView將其添加到視圖之前,以後你可以簡單地通過findViewById(myTextViewId);指的TextView 。

同樣的情況,如果你使用XML文件膨脹你的TextView,並在其中分配一個ID。然後你可以通過findViewById(R.id.myTextView);來引用TextView。

最後,因爲你不能使TextView都final(它不會立即初始化,也不在構造函數中)和class-level(私人,受保護等),我建議做它是你的類中的一個私有變量。

要訪問它,你的方法應該在ui線程中運行,但是一個計時器有它自己的線程,所以你應該使用Handler,並且從你的TimreTask的run方法只發送一個空的消息給它。
在您的HandlerhandleMessage(Message msg)方法中,您可以安全地訪問您的TextView,無論它是您班級的成員,還是隻知道它的id

相關問題