亲:要不要点一下右上角的···
然后再选择“用{浏览器}打开”
这样下次就不会找不到我们了。 不再显示这个提示

字体大小

背景设置

白天夜间浅粉护眼青春

第1章 我是谁

  Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能。假设FragmentActivity有三个Fragment,一般安卓用户期望点击返回键会一层层返回到FragmentActivity。当然,我们可以将每个Fragment对应的Transaction放到BackStack中,但是如果每个Fragment有对返回事件的特殊消费,那么在FragmentActivity的onBackPressed()中的代码就会比较混乱,例如:

  [java]viewplaincopy

  @Override

  publicvoidonBackPressed(){

  if(edFragment.equals(fragmentA)&&fragmentA.hasExpandedRow()){

  fragmentA.collapseRow();

  }elseif(edFragment.equals(fragmentA)&&fragmentA.isShowingLoginView()){

  fragmentA.hideLoginView();

  }elseif(edFragment.equals(fragmentA)){

  popBackStack();

  }elseif(edFragment.equals(fragmentB)&&fragmentB.hasCondition1()){

  fragmentB.reverseCondition1();

  }elseif(edFragment.equals(fragmentB)&&fragmentB.hasCondition2()){

  fragmentB.reverseCondition2();

  }elseif(edFragment.equals(fragmentB)){

  popBackStack();

  }else{

  //handlebyactivity

  super.onBackPressed();

  }

  }

  这对于有代码洁癖的程序猿显然是不能容忍的,后来发现了一种优雅的解决方案。

  首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPressed(),所有BackHandledFragment的子类在onBackPressed方法中处理各自对Back事件的消费逻辑。onBackPressed返回布尔值,宿主FragmentActivity将会根据该方法的返回值判断子Fragment是否有消费Back事件。此外,宿主FragmentActivity还会保持一份当前Fragment的引用,当用户按下Back键时,宿主Activity会判断当前Fragment是否需要消费该事件,如果没有Fragment消费才会自己消费。

  [java]viewplaincopy

  publicabstractclassBackHandledFragmentextendsFragment{

  

  protectedBackHandledInterfacemBackHandledInterface;

  

  /**

  *所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑

  *FragmentActivity捕捉到物理返回键点击事件后会首先询问Fragment是否消费该事件

  *如果没有Fragment消息时FragmentActivity自己才会消费该事件

  */

  protectedabstractbooleanonBackPressed();

  

  @Override

  publicvoidonCreate(BundlesavedInstanceState){

  super.onCreate(savedInstanceState);

  if(!(getActivity()instanceofBackHandledInterface)){

  thrownewClassCastException("HostingActivitymustimplementBackHandledInterface");

  }else{

  this.mBackHandledInterface=(BackHandledInterface)getActivity();

  }

  }

  

  @Override

  publicvoidonStart(){

  super.onStart();

  //告诉FragmentActivity,当前Fragment在栈顶

  mBackHandledInterface.setSelectedFragment(this);

  }

  

  }

  宿主FragmentActivity需要继承BackHandledIntegerface,子Fragment会通过该接口告诉宿主FragmentActivity自己是当前屏幕可见的Fragment。

  [java]viewplaincopy

  publicinterfaceBackHandledInterface{

  

  publicabstractvoidsetSelectedFragment(BackHandledFragmentedFragment);

  }

  所以在Fragment的onCreate中会判断宿主FragmentActivity是否已继承了该接口。在Fragment的onStart()方法中就会调用该接口告诉宿主FragmentActivity自己是当前屏幕可见的Fragment。

  宿主FragmentActivity就可以在onBackPressed()方法中对Back事件进行判断处理了。

  [java]viewplaincopy

  publicclassMainActivityextendsFragmentActivityimplementsBackHandledInterface{

  

  privateBackHandledFragmentmBackHandedFragment;

  privatebooleanhadIntercept;

  

  @Override

  publicvoidsetSelectedFragment(BackHandledFragmentedFragment){

  this.mBackHandedFragment=edFragment;

  }

  

  @Override

  publicvoidonBackPressed(){

  if(mBackHandedFragment==null||!mBackHandedFragment.onBackPressed()){

  if(getSupportFragmentManager().getBackStackEntryCount()==0){

  super.onBackPressed();

  }else{

  getSupportFragmentManager().popBackStack();

  }

  }

  }

  }

【1000万福利免费领,点我开抢!】
  宝宝们,友情提醒:建议您点击右上角“用浏览器打开”,然后保存页面,再点击加入“我的书架”,不然下次不好找咯!
  也可以关注我们的微信公众号“{公众号}”,更多深夜读物等你来戳→_→
【恒幻小说网】关注官方公众号:henghuan2,方便下次阅读,海量阅读币送不停!
下一章
书籍封面 | 加入书签| 目录 | 评论
正在加载