Android,androidsdk

來源:互聯網
上載者:User

Android,androidsdk
乾貨(1)

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

public abstract class BackHandledFragment extends Fragment {        protected BackHandledInterface mBackHandledInterface;            /**      * 所有繼承BackHandledFragment的子類都將在這個方法中實現物理Back鍵按下後的邏輯      * FragmentActivity捕捉到物理返回鍵點擊事件後會首先詢問Fragment是否消費該事件      * 如果沒有Fragment訊息時FragmentActivity自己才會消費該事件      */      protected abstract boolean onBackPressed();            @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          if(!(getActivity() instanceof BackHandledInterface)){              throw new ClassCastException("Hosting Activity must implement BackHandledInterface");          }else{              this.mBackHandledInterface = (BackHandledInterface)getActivity();          }      }            @Override      public void onStart() {          super.onStart();          //告訴FragmentActivity,當前Fragment在棧頂          mBackHandledInterface.setSelectedFragment(this);      }        }

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

public interface BackHandledInterface {      public abstract void setSelectedFragment(BackHandledFragment selectedFragment);  }

所以在Fragment的onCreate中會判斷宿主FragmentActivity是否已繼承了該介面。在Fragment的onStart()方法中就會調用該介面告訴宿主FragmentActivity自己是當前螢幕可見的Fragment。
宿主FragmentActivity就可以在onBackPressed()方法中對Back事件進行判斷處理了。

public class MainActivity extends FragmentActivity implements BackHandledInterface{        private BackHandledFragment mBackHandedFragment;      private boolean hadIntercept;        @Override      public void setSelectedFragment(BackHandledFragment selectedFragment) {          this.mBackHandedFragment = selectedFragment;      }            @Override      public void onBackPressed() {          if(mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()){              if(getSupportFragmentManager().getBackStackEntryCount() == 0){                  super.onBackPressed();              }else{                  getSupportFragmentManager().popBackStack();              }          }      }  }
乾貨(2)

在Fragment的onResume中通過View去監聽。(要注意setFocusableInTouchMode()和requestFocus())

@Overridepublic void onResume() {    super.onResume();    getView().setFocusableInTouchMode(true);    getView().requestFocus();    getView().setOnKeyListener(new View.OnKeyListener() {        @Override        public boolean onKey(View v, int keyCode, KeyEvent event) {            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){                // handle back button                return true;            }            return false;        }    });}
我是天王蓋地虎的分割線

 

 

 

參考:http://vinsol.com/blog/2014/10/01/handling-back-button-press-inside-fragments/

http://stackoverflow.com/questions/22552958/handling-back-press-when-using-fragments-in-android

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.