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

Posted zy9011

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fragment 使用hide和show,使用onHiddenChanged代替执行生命周期相关的知识,希望对你有一定的参考价值。

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的刷新了。

以上是关于Fragment 使用hide和show,使用onHiddenChanged代替执行生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Android中Fragment的Hide和Show

FragmentTransaction的add(),replace(),以及show(),hide()

为啥 Fragment 使用 .setCustomAnimations() 在 .hide() 上崩溃?

jQuery Show / Hide 在 Android 上不起作用

记录Fragment的显示时长

使用观察者模式更新Fragment的内容