我是靠谱客的博主 着急西装,最近开发中收集的这篇文章主要介绍当一个Activity加多个Fragment的时候,点击导航返回按钮无效或者点击back键就把Activity关闭了的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
在开发过程中使用一个Activity加载多个fragment是很常见的 如下图:
如果在Fragment_01之上add了Fragmetn_02后在点title上的返回按钮 把Fragment_02出栈显示Fragment_01这个没问题,但是再点击该返回按钮这时的理想效果是关闭该Activity,可是问题出现了再 怎么点都没反映,通过打印日志发现Fragmetn_02虽然已经出栈了却还持有该返回Button的引用,所以你一直点击title上的返回按钮执行的是一直在将Fragment_02出栈。
解决把法:
我这里用了一个非常笨的解决办法,看代码(若有更好解决办法,望告知):
问题2:因为公司有IOS ,IOS是没有返回热键 ,但是Android有 所以要做2套返回策略 且要一致://在添加Fragment_02的时候 设置一个成员变量的值为true 就是 isBack private void showUser_Cluser() { isback=true;//判断是否加载过Fragment //添加fragment registerActivity.getTv_title_content().setText(getString(R.string.user_clause_title)); UserCluseFragment fragment=new UserCluseFragment(); //替换显示的内容 changeContent(registerActivity.getViewId(), fragment, UserCluseFragment.class.getSimpleName()); }//添加Fragment 这个没什么好说的
protected void changeContent(int id, Fragment f, String tag) { FragmentTransaction transaction = mActivity.getSupportFragmentManager() .beginTransaction(); transaction.add(id, f, tag); transaction.addToBackStack(null); transaction.commit();}
//在看对(Title)back_button的监听操作RxView.clicks(im_back)//忘记密码 .throttleFirst(2, TimeUnit.SECONDS) //两秒钟之内只取一个点击事件,防抖操作 .subscribe(new Action1<Void>() { @Override public void call(Void aVoid) {if(isback) {//加载了新的Fragment isback=!isback;(如果add过Fragmetn,点击返回button就把Fragmetn_02出栈) registerActivity.getTv_title_content().setText("注册"); detachFragment(UserCluseFragment.class.getSimpleName());//将添加Fragment移除 }else { mActivity.finish();(在Fragmetn_02出栈后再点击返回Button 这时 isback的值为false 就执行Activity关闭操作) } }});
//出栈操作(我这里用的是 detach()方法)protected void detachFragment(String tag){ FragmentManager cfm = mActivity.getSupportFragmentManager(); Fragment fragment = cfm.findFragmentByTag(tag); FragmentTransaction transaction = cfm.beginTransaction(); //cfm.popBackStackImmediate();//出栈 transaction.detach(fragment);//将该fragment从队列中移除 transaction.commit(); }
在Activity中我们知道点击了手机返回按键后,这个Activity就会关闭了,但如果这是显示的是Fragmetn_02,我希望的是用户按返回热键,并不是关闭包含该Fragmetn的Activtiy,而是键fragment_02出栈,显示Fragment_01,如何解决(看代码):
//在Fragment_02的 OnCreateView 中 通过返回的View视图去监听返回热键 然后出栈 @Override protected View initView() { mView = View.inflate(mActivity, R.layout.fragment_user_cluse, null); //Back pressed Logic for fragment mView.setFocusableInTouchMode(true); mView.requestFocus(); mView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_BACK) { ((RegisterActivity) mActivity).getTv_title_content().setText("注册"); detachFragment(UserCluseFragment.class.getSimpleName());//将添加的Fragment移除 return true; } } return false; } }); return mView; }protected void detachFragment(String tag){ FragmentManager cfm = mActivity.getSupportFragmentManager(); Fragment fragment = cfm.findFragmentByTag(tag); FragmentTransaction transaction = cfm.beginTransaction(); //cfm.popBackStackImmediate();//出栈 transaction.detach(fragment);//将该fragment从队列中移除 transaction.commit(); } //这时若显示的Fragment_02 用户点击返回按键 就进行Fragment_02出栈操作 显示Fragment_01,若用户在显示Fragment_01的时候点击返回按键,我什么 都不做,直接关闭Activity.
最后
以上就是着急西装为你收集整理的当一个Activity加多个Fragment的时候,点击导航返回按钮无效或者点击back键就把Activity关闭了的问题的全部内容,希望文章能够帮你解决当一个Activity加多个Fragment的时候,点击导航返回按钮无效或者点击back键就把Activity关闭了的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复