优雅的让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();
- }
- }
- }
- }
转载于:https://www.cnblogs.com/xiaorenwu702/p/4561393.html
优雅的让Fragment监听返回键相关推荐
- Fragment监听返回键
Activity 比较容易监听物理键返回事件(onBackPressed):Fragment却不能 假设一个FragmentActivity包含3个Fragment,用户一般期望在返回时,逐层返回到F ...
- android重写返回按钮点击事件,Android Fragment监听返回键
场景:在项目中做联系人界面时,需要按名字和按部门显示联系人,此处使用2个fragment切换显示,按部门显示需要体现部门层级关系,需要实现点击返回上级部门.因为Fragment并不能像在Actvity ...
- Android Fragment 监听返回键
直接给代码*-* Fragment: public boolean onKeyDown(int keyCode, KeyEvent event){if ((keyCode == KeyEvent.KE ...
- 在Android中实现监听 返回键,主键,菜单键
一.监听 返回键 onKeyDown方法和onBackPressed方法 onKeyDown: 是当某个按键被按下是触发.所以也有人在点击返回键的时候去执行该方法来做判断.(该方法只是android ...
- Android监听返回键、Home键+再按一次返回键退出应用
Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plaincopy @Override pub ...
- Android下监听返回键、home键、任务键
1.监听返回键 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYC ...
- Android 如何监听返回键,弹出一个退出对话框
Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. 注:如下代码当时是从网上copy过来的,现在忘了它 ...
- android设置返回按钮无效,Android onKeyDown监听返回键无效的解决办法
Android onKeyDown监听返回键无效的解决办法 当我们的Activity继承了TabActivity,在该类中重写onKeyDown是监听不到返回键的, 具体解决方法如下: 重写dispa ...
- Vue 点浏览器后退 模态框有灰色遮罩,监听返回键 this 无效
问题:前端使用 <el-dialog 实现模态框当打开模态框后,点击浏览器上的后退按钮,发现遮罩还在. 解决办法 监听返回键,遇到的问题是直接用 this.xxx 无效,原因是此处 this 非 ...
最新文章
- C++11 Lambda
- 聊聊asp.net中Web Api的使用
- Flex 3 和PHP连接mysql数据库
- QT的QCache类的使用
- 使用TestNG的弹簧测试支持
- MyBatis 逆向工程(MyBatis 自动生成接口以及xml)的使用
- 阿里云智能视频 AI 重装来袭
- 【BZOJ-4524】伪光滑数 堆 + 贪心 (暴力) [可持久化可并堆 + DP]
- SSL 重点SSL会话步骤
- 基于springboot的户外租车系统
- 高品质深圳市地图shp数据arcgis软件道路地名县区边界水系地铁站点2021年
- 推荐WordPress 必备的常用插件及插件功能介绍
- java读取scv文件
- 【学习OpenCV4】OpenCV4入门介绍
- pyecharts学习笔记
- python 制作 多种 词云
- java crm 进销存 websocket即时聊天发图片文字 好友群组 SSM源码
- plc梯形图转换c语言,求助将梯形图程序转换成指令表,并说明该段梯形图实现的功能...
- 人体解剖学标本长廊的构成、管理及其优势
- 方框滤波(Box filtering)