我是靠谱客的博主 着急西装,最近开发中收集的这篇文章主要介绍当一个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.

最后

以上就是着急西装为你收集整理的当一个Activity加多个Fragment的时候,点击导航返回按钮无效或者点击back键就把Activity关闭了的问题的全部内容,希望文章能够帮你解决当一个Activity加多个Fragment的时候,点击导航返回按钮无效或者点击back键就把Activity关闭了的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部