转载请注明出处:http://write.blog.csdn.net/postedit/40507387

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

[java] view plaincopy
  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消费才会自己消费。

[java] view plaincopy
  1. public abstract class BackHandledFragment extends Fragment {
  2. protected BackHandledInterface mBackHandledInterface;
  3. /**
  4. * 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑
  5. * FragmentActivity捕捉到物理返回键点击事件后会首先询问Fragment是否消费该事件
  6. * 如果没有Fragment消息时FragmentActivity自己才会消费该事件
  7. */
  8. protected abstract boolean onBackPressed();
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. if(!(getActivity() instanceof BackHandledInterface)){
  13. throw new ClassCastException("Hosting Activity must implement BackHandledInterface");
  14. }else{
  15. this.mBackHandledInterface = (BackHandledInterface)getActivity();
  16. }
  17. }
  18. @Override
  19. public void onStart() {
  20. super.onStart();
  21. //告诉FragmentActivity,当前Fragment在栈顶
  22. mBackHandledInterface.setSelectedFragment(this);
  23. }
  24. }

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

[java] view plaincopy
  1. public interface BackHandledInterface {
  2. public abstract void setSelectedFragment(BackHandledFragment selectedFragment);
  3. }

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

[java] view plaincopy
  1. public class MainActivity extends FragmentActivity implements BackHandledInterface{
  2. private BackHandledFragment mBackHandedFragment;
  3. private boolean hadIntercept;
  4. @Override
  5. public void setSelectedFragment(BackHandledFragment selectedFragment) {
  6. this.mBackHandedFragment = selectedFragment;
  7. }
  8. @Override
  9. public void onBackPressed() {
  10. if(mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()){
  11. if(getSupportFragmentManager().getBackStackEntryCount() == 0){
  12. super.onBackPressed();
  13. }else{
  14. getSupportFragmentManager().popBackStack();
  15. }
  16. }
  17. }
  18. }

转载于:https://www.cnblogs.com/xiaorenwu702/p/4561393.html

优雅的让Fragment监听返回键相关推荐

  1. Fragment监听返回键

    Activity 比较容易监听物理键返回事件(onBackPressed):Fragment却不能 假设一个FragmentActivity包含3个Fragment,用户一般期望在返回时,逐层返回到F ...

  2. android重写返回按钮点击事件,Android Fragment监听返回键

    场景:在项目中做联系人界面时,需要按名字和按部门显示联系人,此处使用2个fragment切换显示,按部门显示需要体现部门层级关系,需要实现点击返回上级部门.因为Fragment并不能像在Actvity ...

  3. Android Fragment 监听返回键

    直接给代码*-* Fragment: public boolean onKeyDown(int keyCode, KeyEvent event){if ((keyCode == KeyEvent.KE ...

  4. 在Android中实现监听 返回键,主键,菜单键

    一.监听 返回键 onKeyDown方法和onBackPressed方法 onKeyDown: 是当某个按键被按下是触发.所以也有人在点击返回键的时候去执行该方法来做判断.(该方法只是android ...

  5. Android监听返回键、Home键+再按一次返回键退出应用

    Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plaincopy @Override pub ...

  6. Android下监听返回键、home键、任务键

    1.监听返回键 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYC ...

  7. Android 如何监听返回键,弹出一个退出对话框

    Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. 注:如下代码当时是从网上copy过来的,现在忘了它 ...

  8. android设置返回按钮无效,Android onKeyDown监听返回键无效的解决办法

    Android onKeyDown监听返回键无效的解决办法 当我们的Activity继承了TabActivity,在该类中重写onKeyDown是监听不到返回键的, 具体解决方法如下: 重写dispa ...

  9. Vue 点浏览器后退 模态框有灰色遮罩,监听返回键 this 无效

    问题:前端使用 <el-dialog 实现模态框当打开模态框后,点击浏览器上的后退按钮,发现遮罩还在. 解决办法 监听返回键,遇到的问题是直接用 this.xxx 无效,原因是此处 this 非 ...

最新文章

  1. C++11 Lambda
  2. 聊聊asp.net中Web Api的使用
  3. Flex 3 和PHP连接mysql数据库
  4. QT的QCache类的使用
  5. 使用TestNG的弹簧测试支持
  6. MyBatis 逆向工程(MyBatis 自动生成接口以及xml)的使用
  7. 阿里云智能视频 AI 重装来袭
  8. 【BZOJ-4524】伪光滑数 堆 + 贪心 (暴力) [可持久化可并堆 + DP]
  9. SSL 重点SSL会话步骤
  10. 基于springboot的户外租车系统
  11. 高品质深圳市地图shp数据arcgis软件道路地名县区边界水系地铁站点2021年
  12. 推荐WordPress 必备的常用插件及插件功能介绍
  13. java读取scv文件
  14. 【学习OpenCV4】OpenCV4入门介绍
  15. pyecharts学习笔记
  16. python 制作 多种 词云
  17. java crm 进销存 websocket即时聊天发图片文字 好友群组 SSM源码
  18. plc梯形图转换c语言,求助将梯形图程序转换成指令表,并说明该段梯形图实现的功能...
  19. 人体解剖学标本长廊的构成、管理及其优势
  20. 方框滤波(Box filtering)

热门文章

  1. 有关手游设计ICON的几点建议
  2. 王者荣耀赛季末上分很枯燥,可以找一个猎游陪练一起上分
  3. win10更名导致MySQL无法启动服务
  4. SQL基础【十四、In、Between and】
  5. SQL基础【十、Delete】
  6. example:利用impdp通过dblink导入数据库
  7. Egret的容器--删除对象,遮罩
  8. linux启动lighttpd服务,如何使用Yum在CentOS和RHEL上安装Lighttpd Web服务器
  9. python 分班_小白如何学习python
  10. 近似求PI(15 分)