標籤:
目錄(?)[-]
- 協助提示框的實現
- 實現再彈框
- 再談fragment管理器
提示框的按鈕Help,將觸發彈出新的協助提示框。
協助提示框的實現
協助提示框的實現很簡單,利用重寫onCreateView( )的方式,點擊按鈕是執行dismiss(),關閉對話方塊即可。
代碼不在此重複。dialog fragment的關閉有兩種方式,一種是在dialog fragment中直接執行dismiss(),我們來看看DialogFragment的原始碼片段:
[java] view plaincopy
- /**
- * Dismiss the fragment and its dialog. If the fragment was added to the
- * back stack, all back stack state up to and including this entry will
- * be popped. Otherwise, a new transaction will be committed to remove
- * the fragment.
- */
- public void dismiss() {
- dismissInternal(false);
- }
-
- void dismissInternal(boolean allowStateLoss) {
- if (mDismissed) {
- return;
- }
- mDismissed = true;
- mShownByMe = false;
- if (mDialog != null) {
- mDialog.dismiss();
- mDialog = null;
- }
- mViewDestroyed = true;
- if (mBackStackId >= 0) {
- getFragmentManager().popBackStack(mBackStackId,
- FragmentManager.POP_BACK_STACK_INCLUSIVE);
- mBackStackId = -1;
- } else {
- FragmentTransaction ft = getFragmentManager().beginTransaction();
- ft.remove(this);
- if (allowStateLoss) {
- ft.commitAllowingStateLoss();
- } else {
- ft.commit();
- }
- }
- }
如果back stack堆棧有該dialog,將其pop出來,否則ft.remove(this); ft.commit();。估計pop的操作也包含ft.remove()和ft.commit()。調用dismiss()會觸發onDismiss()回呼函數。跟蹤狀態,如下。
實現再彈框
在PromptDialogFragment中實現彈框的相關代碼如下。這裡採用另一種關閉dialog的方法,通過fragment transaction進行控制。
public void onClick(View v) {
... ...
switch(v.getId()){
case R.id.button_help:
FragmentTransaction ft = getFragmentManager().beginTransaction();
/* 如果不執行remove(),prompt dailog在下層,跟蹤狀態,系統即不會進入onDismiss()狀態。主要考慮美觀的問題,如果下面prompt對話方塊大於協助框,視覺效果不好。下面左圖為執行了remove()的效果,右圖為不執行remove()的效果。
對於Dialog,container為0或者null。 */
ft.remove(this);
/* 將當前的PromptDialogFragment加入到回退堆棧,當使用者按返回鍵,或者通過按協助框的Close按鈕dismiss協助框是,重新顯示提示框。
對於back stack的處理,系統具有一定的智能。例如:執行兩次addToStackStack(),實際不會重複壓棧。 有例如:注釋掉remove()語句,即提示框不消失,而是在協助框的下面,如右圖,由於提示框存在,我們並不需要將提示框鍵入到back stack,但是在實驗中發現是否有addToBackStack()都不會結果有影響,系統能夠分析到對象存在,不需要壓棧。沒有去查原始碼,猜測通過mBackStackId比對來進行智能處理。*/
ft.addToBackStack(null);
HelpDialogFragment hdf = HelpDialogFragment.newInstance(R.string.help_message);
/* 對fragment的處理是通過fragment transaction,與在activity彈框一樣,通過show()方式實現。 在此之前,我們已經通過transaction將當前的fragment加入到back stack中。*/
hdf.show(ft,MainActivity.HELP_DIALOG_TAG);
break;
... ...
}
}
通過remove()和addToBackStack()使得fragment從UI中消失,當仍可以通過fragment管理器和回退堆棧擷取。
再談fragment管理器
通過fragment管理器或者fragment transaction,我們可以對dialog fragment進行具體地控制。show()就是在管理器中加入fragment,dismiss()就是從管理器中去掉fragment。我們不能先進行add(),然後在進行show(),因此一個fragment對象只能加入管理器一次。如果fragment被dismiss(),將從管理器中刪除,我們不能再通過管理器擷取該fragment的資訊。因此,如果我們想保留被dismiss的dialog的一些狀態或資訊,需要在dialog外進行儲存,例如利用activity。
本博文涉及的例子代碼,可以在Pro Android學習:Dialog小例子中下載。
相關連結: 我的Android開發相關文章
【轉】Pro Android學習筆記(四六):Dialog(3):對話方塊彈對話方塊