DialogFragment並不是Dialog,所以習慣上設定Dialog的很多細節都無法直接使用。
設計上(我發現)矛盾的地方在於它確實會產生Dialog類別,但這個類別的產生又限定在MainUIThread中,這會導致「不同時間點使用DialogFragment時會產生Error導致Crash」,但Fragment的使用自由度高、調控會由底層安排,這點似乎在DialogFragment上有漏洞。
要徹底避免,實作DialogFragment時就要使用onCreateView、而不是onCreateDialog。
但這會導致無法使用Dialog的功能,而只能製作setView的內容。
解決方法是使用DialogFragment的getDialog......對!DialogFragment下有這個功能。
但同樣的矛盾問題再次發生:要被MainUIThread執行過後才會有Dialog,在這之前執行getDialog只會得到空值。
所以要注意將整段功能(需要使用到Dialog)的地方丟入MainUIThread中執行、或乾脆等個幾毫秒鐘再繼續執行...(無限判斷是否已經有Dialog。)
另外,FragmentManager要在MainUIThread執行過 executePendingTransactions() ,Dialog才會是「可以被修改的」。(不然,要設個ClickListener?不行。)
設計上(我發現)矛盾的地方在於它確實會產生Dialog類別,但這個類別的產生又限定在MainUIThread中,這會導致「不同時間點使用DialogFragment時會產生Error導致Crash」,但Fragment的使用自由度高、調控會由底層安排,這點似乎在DialogFragment上有漏洞。
要徹底避免,實作DialogFragment時就要使用onCreateView、而不是onCreateDialog。
但這會導致無法使用Dialog的功能,而只能製作setView的內容。
解決方法是使用DialogFragment的getDialog......對!DialogFragment下有這個功能。
但同樣的矛盾問題再次發生:要被MainUIThread執行過後才會有Dialog,在這之前執行getDialog只會得到空值。
所以要注意將整段功能(需要使用到Dialog)的地方丟入MainUIThread中執行、或乾脆等個幾毫秒鐘再繼續執行...(無限判斷是否已經有Dialog。)
另外,FragmentManager要在MainUIThread執行過 executePendingTransactions() ,Dialog才會是「可以被修改的」。(不然,要設個ClickListener?不行。)
沒有留言:
張貼留言