2012-05-20 26 views
0

有兩個類。 MainActivity,我在其中設置視圖,以及我想從中更新MainActivity中的視圖的ClassX。 ClassX是一個從MainActivity調用的AsyncTask,如果這是相關的。Android/Java:從另一個類更改視圖?

我想要做的是更改名爲mainTextLog的視圖的文本。我已經聲明瞭一個全局TextView變量,並且在onCreate()方法中,我使用findViewById()將其設置爲視圖。

private TextView logger; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    logger = (TextView) findViewById(R.id.mainTextLog); 

} 

現在我應該能夠改變onCreate()的文本,我可以。但因爲我想從另一個類的改變(ClassX)我需要爲它創建一個方法:

public void setLogText(String text) { 
    logger.setText(text); 
} 

但它不工作。我試過讓記錄器和setLogText()方法是靜態的,但它仍然不起作用。該應用只是崩潰。

這可能很容易,但我沒有想法。

+0

我沒有代表對給出的答案進行評論,我很抱歉,這不是一個實際的答案,但請注意,你不能創建一個靜態涉及findViewById的方法,因爲findViewById是非靜態的。 (就GHz給出的答案而言)。 – SeaNick

回答

1

如果您使用的是AsyncTask,則需要在onProgressUpdateonPostExecute中設置值。

你真的應該閱讀文檔AsyncTasks

不能更新從doInBackground方法,因爲它沒有在UI線程中運行,並且會給你一個例外的UI。

此外,您應該發佈應用程序崩潰時獲得的異常,以便我們更好地瞭解問題所在。但我猜你試圖從錯誤的線程更新文本。

+0

好的,我明白了。如果我使用onProgressUpdate(),那麼我該怎麼做呢? – qwerty

+0

如果您只是想在完成使用onPostExecute後更新進度。如果您希望在完成時更新它(例如顯示進度),則可以通過調用publishProgress來使用onProgressUpdate:http://developer.android.com/reference/android/os/AsyncTask.html#publishProgress(Progress。 ..)。真的,你應該只是閱讀它解釋如何做到這一點的文檔。 –

+0

好的,我明天再看看(現在上牀睡覺)。謝謝! – qwerty

0

一種可能性是:當您在另一個類X中調用setLogText時MainActivity可能不再存在,這使得logger爲空引用?

1

我已經在應用程序中完成了這麼多工作,在Android平板電腦上它是一種MDI類型的應用程序。

做什麼你問....

在MainActivity

public static void setText(String txt){ 
    ((TextView)findViewById(R.id.mainTextLog)).setText(txt); 
} 

然後在孩子(或調用類)這樣稱呼它......

MainActivity.setText("myTextToShow"); 

就是這樣......即時通訊使用android api level 12 ...如果我記得正確的話,它也可以在api level 7中工作。

希望這有助於...

+0

這幾乎是我有相同的代碼,除了我已經存儲在記錄器中的視圖。它雖然沒有工作。 – qwerty

+0

mainActivity在試圖設置它的時候是空的嗎?如果沒有在main中的方法中彈出一個斷點來查看它是否正在觸發... – GHz

相關問題