亚洲乱码卡一卡二卡三永久-亚洲乱码一二三四区-亚洲乱码一区二区三区在线观看-亚洲伦理一区-成人在色线视频在线观看免费大全-成人在线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年專注高端品質開發
  • 返回頂部
主站蜘蛛池模板: 黄色污污视频在线观看 | 欧美特黄特刺激a一级淫片 欧美特黄视频在线观看 | 香蕉99国内自产自拍视频 | 天天干天天夜 | 欧美日韩一二三四区 | 日韩18在线观看 | 国产区网址 | 成人网18免费网站 | 久久精品国产欧美 | 亚洲成a人v天堂网 | 天天摸日日摸人人看 | 日日操日日 | 免费播放国产一级 | 色香视频在线 | 亚洲第一成年网站大全亚洲 | 看全色黄大色黄大片色责看的 | 99精彩视频 | 成人国产网站 | 精品一区二区三区高清免费观看 | 夜夜拍夜夜爽夜夜拍拍拍 | 波多野结衣资源在线观看 | 高清性色生活片免费视频软件 | 国产视频综合 | 久久精品国产一区二区三区不卡 | 97久久人人爽人人爽人人 | 日韩在线视频中文字幕 | free中国性xxxx| 欧美日韩高清一区 | 亚洲日本久久一区二区va | bbixx在线| 意大利极品xxxxhd | 黄色片视频网 | 国产制服 国产制服一区二区 | 成人小视频网 | 亚洲精品一卡2卡3卡三卡四卡 | 狠狠干2021| 中文天堂在线www | 91久久综合精品国产丝袜长腿 | 成年人在线免费观看视频网站 | 国产成人精品综合久久久软件 | 在线观看黄网站免费继续 |