干货(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())

@Override
public 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

最新文章

  1. 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法
  2. Linux 目录配置
  3. Properties类的使用方法
  4. loj 1026( tarjan + 输出割边 )
  5. CentOS6.6系统源代码安装mysql5.5.28教程(附源码包下载地址)+sysbench的安装
  6. 遇到double 数目过大,转String变成科学计数法
  7. [Netbeans]为面板设置背景图片
  8. MEF 编程指南(三):声明导出
  9. Oracle-查看oracle是否有表被锁
  10. Delphi 停靠技术的应用
  11. Javascript:DOM表格操作
  12. windows mongodb 安装
  13. android 签名被篡改(Keystore was tampered with, or password was incorrect)
  14. Spring接口编程_设值注入和构造注入
  15. Android笔记:Fragment与ViewPager组合时,如何在FragmentActicity获取Fragment对象
  16. R语言︱排序问题
  17. C# Note11:如何优雅地退出WPF应用程序
  18. [Z] SQL SERVER 的前世今生--各版本功能对比
  19. 黄聪:OTP动态密码_Java代码实现
  20. 20145221高其_MSF基础应用

热门文章

  1. nuxus 3在Maven项目的配置和POM文件的配置
  2. python实例[判断操作系统类型]
  3. There are no packages available for install
  4. 采用ASP.NET IIS 注册工具 (Aspnet_regiis.exe)对web.config实行本地加密
  5. nginx源码学习 资料
  6. Xamarin adventures – Differences between iOS simulator and device
  7. Task Parallel Library02,更进一步
  8. delphiredisclient开源GIT
  9. iOS 程序插件及功能动态更新思路
  10. iOS webservice 接口使用方法