1

我有一個DialogFragment,它包含具有自定義視圖的自定義AlertDialog。在配置更改時更改佈局並保存DialogFragment中的狀態

並且存在定位變化的問題。它需要:

  1. 如果需要,保存對話狀態(在AlertDialog中的自定義視圖中的視圖狀態)。
  2. 更改警報對話框的佈局和大小;

在活動上旋轉一切重建是好的,但它足以實現​​和AlertDialog.onRestoreInstanceState()和DialogFragment將做休息。

問題是當活動是不是重新定位改變,但它仍然需要執行上述兩個步驟。完美的解決方案是將派生的AlertDialog或DialogFragment內部的邏輯封裝起來,以便使用該對話的用戶不會擔心任何事情。


我到目前爲止試過的東西。

  1. 簡單的方法。不要重新創建對話框。

我們可以計算出該方向被改變無論是在我們的AlertDialog或DialogFragment.onConfigurationChanged()實施ViewTreeObserver.OnGlobalLayoutListener()。此時此刻,我試圖挽救國家,重新查找並呼籲AlertDialog.setView()。它不工作。狀態正在保存,對話框大小正在改變,但視圖仍然是舊視圖。我不知道爲什麼,也許不允許在對話框顯示時重新查看視圖。

  1. 關閉對話框,重新創建,再次顯示。

我正在嘗試做這樣的事情。在DialogFragment中:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    dismiss(); 
    show(getFragmentManager(), getTag()); 
} 

因此隱藏,重新創建對話框,再次顯示。 它的工作原理!

但是。如果我:

  1. 打開對話框
  2. 轉到主屏幕(隱藏應用程序)活動的
  3. onSaveInstanceState方法和DialogFragment被調用。
  4. 旋轉裝置
  5. 恢復應用
  6. DialogFragment.onConfigurationChanged()將被調用,如果我嘗試在這裏呼籲dismiss()show()這個時候,我會收到"Can not perform this action after onSaveInstanceState",因爲在這一刻活動實際上並沒有恢復。

而我沒有看到正確的地方做這樣的事情。


那麼,還有其他的事情要嘗試嗎?

+0

什麼原因爲您的活動使用'configChanges = orientation'? –

回答

1

如果我正確理解你的問題,你想擁有不同的風景/人像取向佈局? 如果是,並且您的活動因清單而未重新創建,則您有onConfigurationChanged回調來處理任何事情,即您的佈局更改。

創建自定義對話框時,您可能正在使用setContentView(View view)

因此,雖然創建對話框首次設置一些內容視圖這是隻喜歡FrameLayout一般容器等

然後創建方法,它與您要OT節目,並將其添加的所有內容充氣內部佈局動態到您的容器FrameLayout。當方向更改...刪除內部佈局時,再次用不同方向對其進行充氣並再次添加。

+0

你說得對,爲什麼它不能重新創建。目前,我沒有使用'setContentView(View view)',因爲我使用在DialogFragment.createDialog()中創建的自定義'AlertDialog',所以'DialogFragment'只是作爲'AlertDialog'的行爲包裝處理保存狀態,所有的邏輯都在'AlertDialog'中。但我會嘗試你的建議,並嘗試使用'setContentView(View view)'而不是使用'AlertDialog'。 – nicolausYes

+0

但是,如果你使用自定義的AleryDialog,你是如何設置它的自定義佈局? –

+0

現在我在初始化階段爲派生的AlertDialog類中的視圖充氣並調用AlertDialog.setView()。然後在輪換時,我試圖做同樣的操作(再次查看並再次調用'AlertDialog.setView()')。我會盡量不要再次調用AlertDialog.setView(),但刪除子項並將我的內容重新添加到現有容器中,謝謝! – nicolausYes