Fragment 使用hide和show,使用onHiddenChanged代替执行生命周期

来源:互联网 发布:mysql重置初始密码 编辑:程序博客网 时间:2024/05/19 16:49

fragment是我们经常使用到的一个控件,但是,相信大家会出现这样的一个问题,每次切换fragment的时候之前我们一直都是这样写的代码:

/**     * 根据传入的参数来改变当前的fragment     *     * @param fragment     */    private void showFragment(Fragment fragment) {        FragmentTransaction transaction = fragmentManager.beginTransaction();        transaction.replace(R.id.layout_content, fragment);        transaction.commit();    }

但是这样的写法在需要网络数据时会很消耗用户的数据流量和机器性能,所以我们就正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。(这也是谷歌官方推荐的做法)

/**     * 修改显示的内容 不会重新加载     * to 下一个fragment     * mContent 当前的fragment     */    private void switchContent(Fragment to) {        if (mContent != to) {            FragmentTransaction transaction = fragmentManager.beginTransaction();            if (!to.isAdded()) { // 判断是否被add过                // 隐藏当前的fragment,将 下一个fragment 添加进去      transaction.hide(mContent).add(R.id.layout_content, to).commit();             } else {                // 隐藏当前的fragment,显示下一个fragment              transaction.hide(mContent).show(to).commit();             }            mContent = to;        }    }

你会发现使用hide和show这时fragment的生命周期不再执行,不走任何的生命周期,这样在有的情况下,数据将无法通过生命周期方法进行刷新,所以你可以使用onHiddenChanged方法来解决这问题。

@Override    public void onHiddenChanged(boolean hidden) {        super.onHiddenChanged(hidden);        if (hidden) {   // 不在最前端显示 相当于调用了onPause();            return;        }else{  // 在最前端显示 相当于调用了onResume();           //网络数据刷新        }    }

接手别人代码今天碰到这问题了,说是切换了数据没有刷新,我一脸懵逼,执行了下生命周期,改成这样这样你就可以单独处理你需要的fragment的数据和ui的刷新了。

阅读全文
0 0
原创粉丝点击