优雅的让Fragment监听返回键
转载请注明出处:http://write.blog.csdn.net/postedit/40507387
Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能。假设FragmentActivity有三个Fragment,一般安卓用户期望点击返回键会一层层返回到FragmentActivity。当然,我们可以将每个Fragment对应的Transaction放到BackStack中,但是如果每个Fragment有对返回事件的特殊消费,那么在FragmentActivity的onBackPressed()中的代码就会比较混乱,例如:
- @Override
- public void onBackPressed() {
- if(selectedFragment.equals(fragmentA) && fragmentA.hasExpandedRow()) {
- fragmentA.collapseRow();
- } else if(selectedFragment.equals(fragmentA) && fragmentA.isShowingLoginView()) {
- fragmentA.hideLoginView();
- } else if(selectedFragment.equals(fragmentA)) {
- popBackStack();
- } else if(selectedFragment.equals(fragmentB) && fragmentB.hasCondition1()) {
- fragmentB.reverseCondition1();
- } else if(selectedFragment.equals(fragmentB) && fragmentB.hasCondition2()) {
- fragmentB.reverseCondition2();
- } else if(selectedFragment.equals(fragmentB)) {
- popBackStack();
- } else {
- // handle by activity
- super.onBackPressed();
- }
- }
这对于有代码洁癖的程序猿显然是不能容忍的,后来发现了一种优雅的解决方案。
首先创建一个抽象类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();
- }
- }
- }
- }
优雅的让Fragment监听返回键的更多相关文章
- Android 优雅的让Fragment监听返回键
Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能.假设FragmentActivity有三个Fragment,一般安卓用户期望点击返回键会一层层返回到FragmentAc ...
- Android必知必会-Fragment监听返回键事件
如果移动端访问不佳,请尝试 Github版<–点击左侧 背景 项目要求用户注册成功后进入修改个人资料的页面,且不允许返回到上一个页面,资料修改完成后结束当前页面,进入APP主页. 由于是使用多个 ...
- 让Fragment监听返回键
Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能.所以使用到了以下的方法. 首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPre ...
- Fragment监听返回键
首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPressed(),所有BackHandledFragment的子类在onBackPressed方法中处理各自对 ...
- Android监听返回键、Home键+再按一次返回键退出应用
Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME @Override public boolean onKeyDown( ...
- Android 如何监听返回键,弹出一个退出对话框
android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ...
- android 监听返回键
android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE ...
- 【Android】Android实现监听返回键,主键(HOME),菜单键
目录结构: contents structure [+] 简介 监听 返回键 监听 主键(Home键) 监听 菜单键 一.简介 本篇文章介绍如何在Android中实现监听返回键,主键,菜单键.一般情况 ...
- Android 监听返回键退出程序的两种实现
1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定 ...
随机推荐
- modelsim命令行仿真提示“vsim 不是内部或外部命令,也不是可运行的程序或批处理文件”的解决办法
安装完modelsim后,用过命令行模式仿真,如“vsim -c -do run.do”,开始时是可以的. 后来偶然再用该仿真方式,发现命令行提示“vsim 不是内部或外部命令,也不是可运行的程序或批 ...
- Spring 注解回顾
[copy] 参考资料 赵蒙
- Jquery Call WebDav
最近研究了一下WebDav,尝试了一下用Jquery.ajax 发生请求访问WebDav. 代码如下: <!DOCTYPE html> <html xmlns="http: ...
- sharepoint中的YesNo字段
sharepoint中的YesNo字段实际上是一个Boolean字段,性格有点特别,如果IsShow是一个YesNo字段,使用caml查询的时候值为”1“(Yes)”0“(No),Item[IsSho ...
- [功能帮助类] C#取汉字拼音的首字母PinYin帮助类 (转载)
点击下载 PinYin.rar 主要功能就是取汉字拼音的首字母,只要你输入一个汉字,或者是多个汉字就会取出相应的道字母,主要是方便查询使用的 /// <summary> /// 编 码 人 ...
- [FTP] FTPOperater--FTP操作帮助类 (转载)
点击下载 FTPOperater.zip 这个类是关于FTP的一些操作的1.连接FTP服务器 2.上传3.下载4.删除文件5.获取当前目录下明细(包含文件和文件夹) 6.获取FTP文件列表(包括文件 ...
- ios 添加通用断点定位到异常点
今天下午项目突然异常崩溃,因为代码没有多少结构改动,恢复旧版本还是不行,判定为网络获取信息异常,无奈从网络获取的信息太多,搞了很久后发现有个通用异常断点很好用,新手就是新手,浪费时间了.
- 【html】【4】html事件集合
必看参考: http://www.runoob.com/tags/ref-eventattributes.html http://www.cnblogs.com/jiangchongwei/archi ...
- Mysql 操作手册
mysql操作手册 版本:5.6.16mysql linux安装基本步骤:#rpm -e --nodeps mysql-lib-5.1.*#rpm -ivh mysql-server#rpm -ivh ...
- 24种设计模式--迭代模式【Iterator Pattern】
周五下午,我正在看技术网站,第六感官发觉有人在身后,扭头一看,我 C,老大站在背后,赶忙站起来,“王经理,你找我?” 我说. “哦,在看技术呀.有个事情找你谈一下,你到我办公室来一下.” 老大说. 到 ...