优雅的让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秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定 ...
随机推荐
- sublime 2如何进入vim模式
点击菜单栏[Preferences]——[Settings - Defaults] 查找: "ignored_packages": ["Vintage"] 改为 ...
- 第六篇:web之python框架之django
python框架之django python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...
- C#百分比式布局
图一:原始窗口 图二:放大窗口 实现:窗体内添加一个panel1(Dock:Left),在窗体空余部分添加第二个panel2(Dock:Fill),窗体分为两部分. 在panel2内添加一个panel ...
- Bootstarp--全局CSS样式之表格
表格在实际开发中可以说是非常常见的,但是有很多人不喜欢使用表格,但个人觉得在简单的界面布局中使用表格还是很简单的.毕竟人家给了表格这元素,而你却不去使用,貌似有点不解风情. 下面简单介绍Bootstr ...
- memcached 安装
安装 memcached 需要 三部1,下载 memcached 放到php目录将php_memcached.dll 放到php的ext 目录 2,打开管理员命令,将memcached 拖拉到命令中, ...
- xml--小结④DTD的验证问题,不要用IE检验,IE不靠谱
可以自己写代码 <script type="text/javascript"> var xmldoc = new ActiveXObject("Microso ...
- Java中OutOfMemoryError(内存溢出)的情况及解决办法
java.lang.OutOfMemoryError: Java heap space // TODO Auto-generated method stub Vector v = new Vector ...
- 容易被忽略的两个方法:onSaveInstanceState()和onRestoreInstanceState()
onSaveInstanceState()和onRestoreInstanceState()两个方法,在Activity中是比较容易忽视的方法,但是不得不说还是比较好用的方法,onSaveInstan ...
- js - 多个函数动态加载
//动态添加物流锁的IEMI列表. function createLi() { var r = '<s:property value="#session.locks"/> ...
- java.sql.Date to java.util.Date
发这篇博文的题目可能无法直接表示内容,但是确实是java.sql.Date和java.util.Date. 今天在使用'net.sf.json.JSONObject'封装json数据的时候,碰到很奇怪 ...