亚洲乱码卡一卡二卡三永久-亚洲乱码一二三四区-亚洲乱码一区二区三区在线观看-亚洲伦理一区-成人在色线视频在线观看免费大全-成人在线91

Activity可以很容易的得到物理返回鍵的監聽事件,而Fragment卻不能。假設FragmentActivity有三個Fragment,一般安卓用戶期望點擊返回鍵會一層層返回到FragmentActivity。當然,我們可以將每個Fragment對應的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. }
復制代碼

這對于有代碼潔癖的程序猿顯然是不能容忍的,后來發現了一種優雅的解決方案。

 

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

 

  1. public abstract class BackHandledFragment extends Fragment {
  2.  
  3.         protected BackHandledInterface mBackHandledInterface;
  4.         
  5.         /**
  6.          * 所有繼承BackHandledFragment的子類都將在這個方法中實現物理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,當前Fragment在棧頂
  26.                 mBackHandledInterface.setSelectedFragment(this);
  27.         }
  28.         
  29. }
復制代碼

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

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

所以在Fragment的onCreate中會判斷宿主FragmentActivity是否已繼承了該接口。在Fragment的onStart()方法中就會調用該接口告訴宿主FragmentActivity自己是當前屏幕可見的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. }
復制代碼
示例程序Github鏈接
參考資料:

Handling back button press Inside Fragments

穩定

產品高可用性高并發

貼心

項目群及時溝通

專業

產品經理1v1支持

快速

MVP模式小步快跑

承諾

我們選擇聲譽

堅持

10年專注高端品質開發
  • 返回頂部
主站蜘蛛池模板: 两个人看的www中文字幕 | 午夜影院h| 看黄网站在线播放 | a毛片在线看片免费 | 免费观看成人羞羞视频网站观看 | 成年人免费在线视频观看 | 大片免费播放器 | xxxwww欧美性 | 日韩一区在线播放 | 天天综合天天做天天综合 | 成年美女黄网站色大免费观看软件 | aaaaaaaaa在线观看| 日日噜噜噜噜人人爽亚洲精品 | 日本中文字幕在线视频 | 亚洲精品人成无码中文毛片 | 91蜜臀视频 | 亚洲成年人 | 好男人www社区视频在线 | 日本黄色免费网址 | 男女靠逼网站 | 日韩欧美亚洲国产高清在线 | 色操在线 | 一级片免 | 天天做天天爱天天做天天吃中 | 亚洲成综合人影院在院播放 | 综合自拍亚洲综合图区美腿丝袜 | 日韩免费一区二区 | 亚洲国产精品视频 | 亚洲国产模特在线播放 | 欧美色图亚洲图片 | 国产盗摄一区二区欧美精品 | 亚洲国产一区二区三区 | 一个人在线免费观看www | 免费一区二区三区视频狠狠 | 国产精品视频永久免费播放 | 日日摸日日添夜夜爽97 | 天天干 夜夜操 | 日韩在线黄色 | 中国一级黄色毛片 | 国产免费啪视频观看网站 | 精品在线免费视频 |