【轉】Pro Android學習筆記(四六):Dialog(3):對話方塊彈對話方塊

來源:互聯網
上載者:User

標籤:

目錄(?)[-]

  1. 協助提示框的實現
  2. 實現再彈框
  3. 再談fragment管理器

提示框的按鈕Help,將觸發彈出新的協助提示框。

協助提示框的實現

協助提示框的實現很簡單,利用重寫onCreateView( )的方式,點擊按鈕是執行dismiss(),關閉對話方塊即可。

代碼不在此重複。dialog fragment的關閉有兩種方式,一種是在dialog fragment中直接執行dismiss(),我們來看看DialogFragment的原始碼片段:

[java] view plaincopy 
  1. /** 
  2.  * Dismiss the fragment and its dialog.  If the fragment was added to the 
  3.  * back stack, all back stack state up to and including this entry will 
  4.  * be popped.  Otherwise, a new transaction will be committed to remove 
  5.  * the fragment. 
  6.  */  
  7. public void dismiss() {  
  8.     dismissInternal(false);  
  9. }  
  10.   
  11. void dismissInternal(boolean allowStateLoss) {  
  12.     if (mDismissed) {  
  13.         return;  
  14.     }  
  15.     mDismissed = true;  
  16.     mShownByMe = false;  
  17.     if (mDialog != null) {  
  18.         mDialog.dismiss();  
  19.         mDialog = null;  
  20.     }  
  21.     mViewDestroyed = true;  
  22.     if (mBackStackId >= 0) {  
  23.         getFragmentManager().popBackStack(mBackStackId,  
  24.                 FragmentManager.POP_BACK_STACK_INCLUSIVE);  
  25.         mBackStackId = -1;  
  26.     } else {  
  27.         FragmentTransaction ft = getFragmentManager().beginTransaction();  
  28.         ft.remove(this);   
  29.         if (allowStateLoss) {  
  30.             ft.commitAllowingStateLoss();  
  31.         } else {  
  32.             ft.commit();  
  33.         }  
  34.     }  
  35. }  

如果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):對話方塊彈對話方塊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.