日韩视频中文字幕_最新中文字幕在线_天天精品_欧美一级在线_亚洲男人天堂网_麻豆乱码国产一区二区三区

Activity可以很容易的得到物理返回鍵的監(jiān)聽事件,而Fragment卻不能。假設(shè)FragmentActivity有三個Fragment,一般安卓用戶期望點擊返回鍵會一層層返回到FragmentActivity。當(dāng)然,我們可以將每個Fragment對應(yīng)的Transaction放到BackStack中,但是如果每個Fragment有對返回事件的特殊消費,那么在FragmentActivity的onBackPressed()中的代碼就會比較混亂,例如:

  1. @Override
  2. public void onBackPressed() {
  3.     if(selectedFragment.equals(fragmentA) && fragmentA.hasExpandedRow()) {
  4.         fragmentA.collapseRow();
  5.     } else if(selectedFragment.equals(fragmentA) && fragmentA.isShowingLoginView()) {
  6.         fragmentA.hideLoginView();
  7.     } else if(selectedFragment.equals(fragmentA)) {
  8.         popBackStack();
  9.     } else if(selectedFragment.equals(fragmentB) && fragmentB.hasCondition1()) {
  10.         fragmentB.reverseCondition1();
  11.     } else if(selectedFragment.equals(fragmentB) && fragmentB.hasCondition2()) {
  12.         fragmentB.reverseCondition2();
  13.     } else if(selectedFragment.equals(fragmentB)) {
  14.         popBackStack();
  15.     } else {
  16.         // handle by activity
  17.         super.onBackPressed();
  18.     }
  19. }
復(fù)制代碼

這對于有代碼潔癖的程序猿顯然是不能容忍的,后來發(fā)現(xiàn)了一種優(yōu)雅的解決方案。

 

首先創(chuàng)建一個抽象類BackHandledFragment,該類有一個抽象方法onBackPressed(),所有BackHandledFragment的子類在onBackPressed方法中處理各自對Back事件的消費邏輯。onBackPressed返回布爾值,宿主FragmentActivity將會根據(jù)該方法的返回值判斷子Fragment是否有消費Back事件。此外,宿主FragmentActivity還會保持一份當(dāng)前Fragment的引用,當(dāng)用戶按下Back鍵時,宿主Activity會判斷當(dāng)前Fragment是否需要消費該事件,如果沒有Fragment消費才會自己消費。

 

  1. public abstract class BackHandledFragment extends Fragment {
  2.  
  3.         protected BackHandledInterface mBackHandledInterface;
  4.         
  5.         /**
  6.          * 所有繼承BackHandledFragment的子類都將在這個方法中實現(xiàn)物理Back鍵按下后的邏輯
  7.          * FragmentActivity捕捉到物理返回鍵點擊事件后會首先詢問Fragment是否消費該事件
  8.          * 如果沒有Fragment消息時FragmentActivity自己才會消費該事件
  9.          */
  10.         protected abstract boolean onBackPressed();
  11.         
  12.         @Override
  13.         public void onCreate(Bundle savedInstanceState) {
  14.                 super.onCreate(savedInstanceState);
  15.                 if(!(getActivity() instanceof BackHandledInterface)){
  16.                         throw new ClassCastException("Hosting Activity must implement BackHandledInterface");
  17.                 }else{
  18.                         this.mBackHandledInterface = (BackHandledInterface)getActivity();
  19.                 }
  20.         }
  21.         
  22.         @Override
  23.         public void onStart() {
  24.                 super.onStart();
  25.                 //告訴FragmentActivity,當(dāng)前Fragment在棧頂
  26.                 mBackHandledInterface.setSelectedFragment(this);
  27.         }
  28.         
  29. }
復(fù)制代碼

宿主FragmentActivity需要繼承BackHandledIntegerface,子Fragment會通過該接口告訴宿主FragmentActivity自己是當(dāng)前屏幕可見的Fragment。

  1. public interface BackHandledInterface {
  2.  
  3.         public abstract void setSelectedFragment(BackHandledFragment selectedFragment);
  4. }
復(fù)制代碼

所以在Fragment的onCreate中會判斷宿主FragmentActivity是否已繼承了該接口。在Fragment的onStart()方法中就會調(diào)用該接口告訴宿主FragmentActivity自己是當(dāng)前屏幕可見的Fragment。

宿主FragmentActivity就可以在onBackPressed()方法中對Back事件進行判斷處理了。

  1. public class MainActivity extends FragmentActivity implements BackHandledInterface{
  2.  
  3.         private BackHandledFragment mBackHandedFragment;
  4.         private boolean hadIntercept;
  5.  
  6.         @Override
  7.         public void setSelectedFragment(BackHandledFragment selectedFragment) {
  8.                 this.mBackHandedFragment = selectedFragment;
  9.         }
  10.         
  11.         @Override
  12.         public void onBackPressed() {
  13.                 if(mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()){
  14.                         if(getSupportFragmentManager().getBackStackEntryCount() == 0){
  15.                                 super.onBackPressed();
  16.                         }else{
  17.                                 getSupportFragmentManager().popBackStack();
  18.                         }
  19.                 }
  20.         }
  21. }
復(fù)制代碼
示例程序Github鏈接
參考資料:

Handling back button press Inside Fragments

穩(wěn)定

產(chǎn)品高可用性高并發(fā)

貼心

項目群及時溝通

專業(yè)

產(chǎn)品經(jīng)理1v1支持

快速

MVP模式小步快跑

承諾

我們選擇聲譽

堅持

10年專注高端品質(zhì)開發(fā)
  • 返回頂部
主站蜘蛛池模板: 91偷拍精品一区二区三区 | 亚洲伊人久久综合 | 天天色影院 | 青青草视频免费观看 | 男人都懂的www网站免费观看 | 新99热| 99re国产精品视频 | 国产成人午夜视频 | 久草电影网 | 国内精品视频一区二区三区 | 国产精品视频男人的天堂 | 91国内精品 | 亚洲欧美日韩另类精品一区二区三区 | 在线视频一区二区三区 | 一区免费视频 | 99re在线视频 | 日韩欧美在线视频 | 欧美一二三区在线 | 国产精品自产拍在线观看桃花 | 国产精品一二三区 | 美女毛片| 日韩一区欧美 | 日日夜夜免费精品视频 | 亚洲视频手机在线观看 | 欧美日韩国产一区二区三区 | 国产精品久久久久久吹潮 | 国产大片中文字幕在线观看 | 亚洲一二三四五六区 | www.99热这里只有精品 | 91大神在线看| 色av综合 | 伊人激情网 | 日本欧美国产 | 一本久久a久久精品亚洲 | 成人免费视频观看视频 | 玖玖国产精品视频 | 久草在线资源视频 | 国产在线中文字幕 | 成人精品鲁一区一区二区 | 91精品综合久久久久久五月天 | 九九久久这里只有精品 |