考慮以下情形:上方向正確留住聽衆改變
- 我有UI元素的
Activity
當點擊 - 的
DialogFragment
有聽衆interface
的Activity
提供的實現,啓動一個DialogFragment
。比方說,在Activity
是一個圖像編輯器和DialogFragment
選擇一個對比 - 對話將有一個OnContrastChangedListener
的Activity
實現 的
Activity
已執行了interface
更新其UI意見。繼續圖像編輯器例如,Activity
實現OnContrastChangedListener
更新其預覽視圖 - 是這樣的:contrastDialog.setOnContrastChangedListener(new OnContrastChangedListener { @Override public void OnContrastChanged(int newContrast) { getPreviewView().updateWithContrast(newContrast); } });
方向改變,一切都重新與聽者保存和恢復正確使用方法的建議here (偵聽器保存在
Fragment
中,並在生命週期恢復狀態時恢復)。
的問題是監聽器接口現在不工作。該功能getPreviewView()
現在返回null
即使在Activity
叫其他地方,當它返回正確的值
藉口窮人術語(我在編譯和字節碼是有限的知識),但我可以把握髮生了什麼事。該界面已編譯爲getPreviewView()
版本,該版本返回在方向更改時被破壞的預覽視圖,並且此版本已被釋放/垃圾收集/現在爲null
。
我的問題是,是否有一種方法在Java中使界面編譯期望值/函數改變 - 很像C中的volatile
關鍵字(我期待沒有)?在那種情況下,解決這種情況的最佳方法是什麼?我已經考慮了以下幾點:
-
在當Activity
被重建是重新運行該代碼創建DialogFragment
(及其interface
)。對於OnClickListeners
對Buttons
這是很好的,因爲它們是絕對創建的。但是,當按下按鈕這個DialogFragment
只被創建,所以這種方法意味着對於屏幕的每個對話框每次Activity
是在創建 - 這似乎浪費給予他們甚至可能不會運行 -
創建所有可能interfaces
爲Activity
,並將它們保存在成員變量中,然後在請求由事件創建DialogFragments
時使用這些interfaces
。以上評論與上面相同 - 看起來很浪費,創造每一個可能的interface
以防萬一它運行。 - 在活動中保留一些hacky「打開對話框狀態」成員變量,指導
interfaces
的重新創建。 Hacky並在Activity
和DialogFragment
之間建立了聯繫,這不是很好的做法。
正如你所看到的,所有的選項都涉及娛樂,這在一定程度上是浪費的 - 有沒有辦法重用現有的interface
實現?
編輯:選項1和2不會工作,因爲他們需要鏈接到現有Dialog
。這一切都是可行的,但它越來越傾向於擁有'當前對話'變量的入侵選項,當活動重新啓動時獲得DialogFragment
和FragmentManager
,基於'當前對話'變量適當地轉換它,重新創建監聽器。有沒有一個混亂的方式?
getPreviewView()實現在哪裏?你能告訴我們這種方法嗎? – 2014-10-04 04:32:50
@ Code-Apprentice:這只是一個例子。對於這個例子,它的實現可以簡單地爲'return(PreviewView)findViewById(R.id.preview);''其中'PreviewView'是一個自定義視圖類,'R.id.preview'是XML佈局中定義的ID – 2014-10-04 05:19:22