我有一個DialogFragment,它包含具有自定義視圖的自定義AlertDialog。在配置更改時更改佈局並保存DialogFragment中的狀態
並且存在定位變化的問題。它需要:
- 如果需要,保存對話狀態(在AlertDialog中的自定義視圖中的視圖狀態)。
- 更改警報對話框的佈局和大小;
在活動上旋轉一切重建是好的,但它足以實現和AlertDialog.onRestoreInstanceState()
和DialogFragment將做休息。
問題是當活動是不是重新定位改變,但它仍然需要執行上述兩個步驟。完美的解決方案是將派生的AlertDialog或DialogFragment內部的邏輯封裝起來,以便使用該對話的用戶不會擔心任何事情。
我到目前爲止試過的東西。
- 簡單的方法。不要重新創建對話框。
我們可以計算出該方向被改變無論是在我們的AlertDialog或DialogFragment.onConfigurationChanged()
實施ViewTreeObserver.OnGlobalLayoutListener()
。此時此刻,我試圖挽救國家,重新查找並呼籲AlertDialog.setView()
。它不工作。狀態正在保存,對話框大小正在改變,但視圖仍然是舊視圖。我不知道爲什麼,也許不允許在對話框顯示時重新查看視圖。
- 關閉對話框,重新創建,再次顯示。
我正在嘗試做這樣的事情。在DialogFragment中:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
dismiss();
show(getFragmentManager(), getTag());
}
因此隱藏,重新創建對話框,再次顯示。 它的工作原理!
但是。如果我:
- 打開對話框
- 轉到主屏幕(隱藏應用程序)活動的
onSaveInstanceState
方法和DialogFragment被調用。- 旋轉裝置
- 恢復應用
DialogFragment.onConfigurationChanged()
將被調用,如果我嘗試在這裏呼籲dismiss()
或show()
這個時候,我會收到"Can not perform this action after onSaveInstanceState"
,因爲在這一刻活動實際上並沒有恢復。
而我沒有看到正確的地方做這樣的事情。
那麼,還有其他的事情要嘗試嗎?
什麼原因爲您的活動使用'configChanges = orientation'? –