2013-10-25 58 views
0

我希望我的應用程序在屏幕方向更改時重新建立藍牙連接。我有一個SavedState對象,它包含BT串行服務數據等,我可以使用onRetainNonConfigurationInstance()保存並使用getLastNonConfigurationInstance()進行恢復,但當屏幕方向更改時,我的TextView字段不再更新。使用onRetainNonConfigurationInstance()時,TextViews消失

我有兩個xml文件的佈局 - 一個在layout-port和一個在layout-land文件夾中分別重新格式化視圖。 TextView ID在兩個xml文件中都是相同的,只是它們的位置發生了變化。

如果我將覆蓋的onRetainNonConfigurationInstance()調用註釋掉,TextViews再次可見,但我當然不能再自動重新連接到BT設備。

當onDestroy()被調用時BT服務停止,因此每次屏幕更改時都必須重新建立。

重寫對onRestoreInstanceState()和onSaveInstanceState()的調用似乎沒有效果。

任何人都可以指出我正確的方向嗎?消失的視圖是永久的 - 即從一個方向改變並再次返回不會恢復TextView。

+0

請勿使用onRetainNonConfigurationInstance(和get)。他們已被棄用。 –

+0

你正在使用一項活動或碎片? –

+0

然後...發佈您的一些ACtivity(或片段)代碼。 –

回答

0

當設備方向改變時,視圖將從屏幕上消失(不再顯示)並重新創建。相應的活動也會發生同樣的情況。只有當它們不再被引用時,現在不可見的視圖和活動纔會被垃圾收集。文本視圖中的文本由系統保留,前提是視圖具有唯一的ID。視圖重新創建的事實意味着您必須再次執行findViewById()

現在,從MVC的角度來看,Activity控制器。您的藍牙連接絕對是型號的一部分(它必須在方向更改後生存)。所以不要將藍牙相關的數據保存在Activity中。您可以使用例如一個靜態變量或Application子類中的字段,或其他任何您認爲合適的字段。 至於MVC 查看,它是你通過XML指定的;原則上,你可以定義你的自定義類,如MyCustomButton,但通常你只是重用現有的東西。