当一个Activity加多个Fragment的时候,点击导航返回按钮无效或者点击back键就把Activity关闭了的问题

在开发过程中使用一个Activity加载多个fragment是很常见的 如下图:

 如果在Fragment_01之上add了Fragmetn_02后在点title上的返回按钮  把Fragment_02出栈显示Fragment_01这个没问题,但是再点击该返回按钮这时的理想效果是关闭该Activity,可是问题出现了再 怎么点都没反映,通过打印日志发现Fragmetn_02虽然已经出栈了却还持有该返回Button的引用,所以你一直点击title上的返回按钮执行的是一直在将Fragment_02出栈。

解决把法:

我这里用了一个非常笨的解决办法,看代码(若有更好解决办法,望告知):

//在添加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();
}
问题2:因为公司有IOS ,IOS是没有返回热键 ,但是Android有 所以要做2套返回策略 且要一致:

在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.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值