让Fragment监听返回键

Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能。所以使用到了以下的方法。

首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPressed(),所有BackHandledFragment的子类在onBackPressed方法中处理各自对Back事件的消费逻辑。onBackPressed返回布尔值,宿主FragmentActivity将会根据该方法的返回值判断子Fragment是否有消费Back事件。此外,宿主FragmentActivity还会保持一份当前Fragment的引用,当用户按下Back键时,宿主Activity会判断当前Fragment是否需要消费该事件,如果没有Fragment消费才会自己消费。

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

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

1 public interface BackHandledInterface {
2     public abstract void setSelectedFragment(BackHandledFragment selectedFragment);
3 }

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

 1 public class MainActivity extends FragmentActivity implements BackHandledInterface{
 3     private BackHandledFragment mBackHandedFragment;
 4     private boolean hadIntercept;
 6     private Button mBtn;
 7
 8     @Override
 9     protected void onCreate(Bundle savedInstanceState) {
10         super.onCreate(savedInstanceState);
11         setContentView(R.layout.activity_main);
12         this.mBtn = (Button)findViewById(R.id.btn);
13         this.mBtn.setOnClickListener(new OnClickListener() {
14
15             @Override
16             public void onClick(View v) {
17                 MyFragment f = new MyFragment();
18                 FragmentManager fm = getSupportFragmentManager();
19                 FragmentTransaction ft = fm.beginTransaction();
20                 ft.replace(R.id.container, f);
21                 ft.addToBackStack("tag");
22                 ft.commit();
23             }
24         });
25     }
26
27     @Override
28     public void setSelectedFragment(BackHandledFragment selectedFragment) {
29         this.mBackHandedFragment = selectedFragment;
30     }
31
32     @Override
33     public void onBackPressed() {
34         if(mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()){
35             if(getSupportFragmentManager().getBackStackEntryCount() == 0){
36                 super.onBackPressed();
37             }else{
38                 getSupportFragmentManager().popBackStack();
39             }
40         }
41     }
42 }

在Fragment中调用使用。

 1 public class MyFragment extends BackHandledFragment {
 3     private boolean hadIntercept;
 5     @Override
 6     public View onCreateView(LayoutInflater inflater,
 7             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 8         return getLayoutInflater(savedInstanceState).inflate(R.layout.fragment_a, null);
 9     }
10
11     @Override
12     protected boolean onBackPressed() {
13         if(hadIntercept){
14             return false;
15         }else{
16             Toast.makeText(getActivity(), "Click MyFragment", Toast.LENGTH_SHORT).show();
17             hadIntercept = true;
18             return true;
19         }
20     }
21
22 }

Demo:https://github.com/mxy1228/FragmentHandleBackDemo/

时间: 2024-10-29 23:41:21

让Fragment监听返回键的相关文章

Android必知必会-Fragment监听返回键事件

如果移动端访问不佳,请尝试 Github版<–点击左侧 背景 项目要求用户注册成功后进入修改个人资料的页面,且不允许返回到上一个页面,资料修改完成后结束当前页面,进入APP主页. 由于是使用多个Fragment完成注册流程,就需要Fragment监听用户点击手机上的返回按钮,查了一些资料,加上自己使用过程中发现的问题,特此记录,帮助更多有此需求的朋友 代码实现 XXX_Fragment @Override public void onResume() { super.onResume(); ge

优雅的让Fragment监听返回键

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

Android 优雅的让Fragment监听返回键

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

Fragment监听返回键

首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPressed(),所有BackHandledFragment的子类在onBackPressed方法中处理各自对Back事件的消费逻辑.onBackPressed返回布尔值,宿主FragmentActivity将会根据该方法的返回值判断子Fragment是否有消费Back事件.此外,宿主FragmentActivity还会保持一份当前Fragment的引用,当用户按下Back键时,宿主Activity会判断当

[转]Android 如何监听返回键,弹出一个退出对话框

本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. 注:如下代码当时是从网上copy过来的,现在忘了它出自哪个原作者了,在此说声抱歉. 源码如下: [html] view plaincopyprint? public class BackKeyTest extends Activi

大叔也说Xamarin~Android篇~监听返回键,单击返回某个webView,双击退出

原文:大叔也说Xamarin~Android篇~监听返回键,单击返回某个webView,双击退出 这个操作在原生android里是很容易实现的,在xamarin里也不难,在activity里有方法OnKeyDown,我们只需要重写一下就可以了,然后通过webView重新加载到要返回的页面即可,当然操作有些死板,但还是有着不错的效果! 实现的原理就是在activity里设置一个时间,单击后把这个时间赋值并与当前时间进行比较,如果在2秒内,就认为是双击操作,当然这个时间间隔你可以自己设置,在认为是双

Android 监听返回键退出程序的两种实现

1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定时器是每次用户按下返回键才去创建. 代码如下: /** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyC

android 监听返回键

android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { return true; } return super.onKeyDown(keyCode, event); } event.getRepeatCount() == 0重复次数:1次

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

Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plain copy @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { //++自定义点击事件 return tru