2012-01-21 49 views
0

我在xml中有一個佈局。我怎樣才能永久引用視圖? (android)

在我的活動,在onCreate方法我到我想要週期性地更新這樣的視圖的引用:

的TextView =會將myText(的TextView)findViewById(R.id.textview1);

然後,在週期性的方法,我這樣做:

myText.setText(Float.toString(MYDATA的));

它工作正常,直到屏幕旋轉。

我讀到,當屏幕旋轉時,佈局被重新創建,佈局中的所有視圖都被重新創建,所以舊的引用不起作用。

我的代碼:

private TextView myText; //Its a class member 

public void onCreate(Bundle savedInstanceState) { 
    //Other things 
    myText = (TextView)findViewById(R.id.textview1); 
    //Other things 
} 

//This is the periodic method, it occurs many times per second 
public final void onSensorChanged(SensorEvent event) { 
    myText.setText(Float.toString(event.myData)); 
    //This setText works fine until the screen rotation 
} 

我怎麼能有一個永久的參考看法? 如何知道屏幕何時旋轉?

謝謝

+0

你是什麼意思「舊引用不工作」?你有例外嗎? – Korbi

+0

在那裏的代碼中,「myText」存儲對TextView的引用。但是當屏幕旋轉時,TextView被銷燬,而其他TextView將在新佈局(在旋轉發生時創建)中替換它,所以myText現在引用不存在的TextView。 – Alex

+0

但是你在哪裏設置'myText'成員變量?在你的示例代碼中,你正在設置本地。你能告訴我們更多的代碼嗎? –

回答

1

如果您想要永久參考,您可能會考慮一些不正確的事情。當手機旋轉時(假設您允許旋轉),視圖將從內存中移除。

在旋轉點,您需要獲取指向新創建對象的指針。

檢測與佈局使用onConfigurationChanged相關的方向更改,如本文所示。

How to detect orientation change in layout in Android?

+0

Thanx,做了這項工作。 :) – Alex

0

只需要使用的onCreate初始化實例變量()。如果你是懶惰的執行findViewById(),你可以用我的小噴射器庫:

https://github.com/ko5tik/andject

1

你註銷你的聽衆傳感器在onPause()?我認爲你必須在銷燬視圖和調用onCreate()之間獲取傳感器事件。 (您可以嘗試設置一些斷點以查看是否發生這種情況。)

看看the code on this page應該如何完成。

否則,該代碼應該工作。 (我在我的代碼中執行此操作,這很好 - 在創建新視圖後應重新分配成員。)

您應該不需要擔心onConfigurationChanged(),Android文檔鼓勵您不要混亂有了這個。

+0

是的,sensorListener管理我認爲我正在做正確的onPause和onResume方法,問題只是對View的引用,但我用onConfigurationChanged解決了它。你認爲該怎麼辦?我想學習如何正確地使用它,現在它可以正常工作,但是如果你認爲它可以以其他方式完成,請告訴我:) – Alex

+0

當你自己處理這個事件時,你完全阻止了視圖的重新創建。你已經隱藏了一個錯誤,但沒有修復它。當您的應用由於其他原因而重新啓動時(例如,內存不足的任務切換),仍可能發生此故障。文檔說,處理onConfigurationChanged()自己[「應該被認爲是最後的手段」](http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange)。 –