2013-07-17 28 views
-1

我希望我的應用程序支持右手和左手用戶的不同佈局。因此,在更改相應的偏好之後,我想以與重新啓動時相同的方式重新啓動該活動。方向改變。重新開始活動,例如方向更改

我試過到目前爲止:

Intent intent = getIntent(); 
finish(); 
startActivity(intent); 

這並不存儲和加載保存實例狀態

2.

View cv = findViewById(android.R.id.content); 

SparseArray<Parcelable> state = new SparseArray<Parcelable>(); 
cv.saveHierarchyState(state); 
setContentView(desiredCv); 

cv = findViewById(android.R.id.content); 
cv.restoreHierarchyState(state); 

甚至那麼許多事情並不是他們應該做的。

我認爲最終我可以弄清楚如何在不重新啓動的情況下正確地更改佈局,但以與系統定義的配置更改相同的方式執行它會容易得多。

+0

爲什麼不使用片段並根據用戶選擇切換它們? – PravinCG

+1

如果你真的想這樣做,你應該手動保存實例狀態並將其打包到發送給新活動的意圖中。儘管如此,片段會更乾淨。 – Geobits

+0

@PravinCG我會給片段一個嘗試,但我希望有一個更簡單的解決方案,因爲該應用程序實際上不需要額外的功能和片段的複雜性 –

回答

1

您可以使用Fragments並以編程方式執行此操作。遵循相同的方式,您也可以在界面中重新排列您的元素,但我認爲維護起來會很複雜。

OnSaveInstanceState()不會在正在完成的活動上調用。而且我不知道有什麼方法可以讓Android爲您處理。

解決方案可能是創建2個不同的佈局文件。然後,基於已更新的首選項,以編程方式在onCreate()方法中選擇正確的一個。

如果您的兩個佈局對那些需要恢復的視圖使用相同的ID,那麼您可以實現兩種方法將這些狀態保存在Bundle中,並從Bundle中檢索這些狀態。當你想改變佈局時,用適當的意圖開始一個新的活動(告訴活動要加載哪個佈局);在與此意圖關聯的包中保存您所需的內容並在onCreate()中檢索它以更新視圖。在使用layout dx或sx的情況下,您不需要複製代碼;您可以使用相同的代碼,因爲這兩個佈局使用相同的ID。

以這種方式你仍然有你的一個活動,並可以重用你的代碼。用於恢復佈局更改狀態的相同代碼仍然可以與onSaveInstanceState()onRestoreInstanceState()一起使用,因爲再次,ID是相同的。

爲了簡短起見,請使用包。

1

如果您使用API​​等級11或更高(Android 3.0或更高版本),則可以在您的活動中調用recreate()。這會破壞當前的實例並創建一個新的實例,並且應該執行與配置更改期間發生的事情相同的操作(例如,將調用onSaveInstanceState()等)。

+0

不幸的是,我需要它也適用於較低版本(至少Android 2.2) –