fragment 切换判断界面是否可见 setUserVisibleHint 和 onHiddenChanged 使用场景

fragment大家经常应用到 生命周期依赖于宿主activity

1、第一种用法:切换fragment

/**

使用replace方法

     */
    private void showMyFragment(Fragment fragment) {
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.layout_fragment, fragment);
        transaction.commit();
    }

这种方法切换的fragment进行请求网络等会消耗流量和性能

2、第二种用法:add hide show------onHiddenChange()

使用场景:add hide show进行fragment切换的时候

所以按照google老大哥的方式 添加使用add 隐藏使用hide 需要判断是否添加 如果添加直接show

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

    }

使用 add hide() show() 方法切换fragment 不会走任何的生命周期 无法通过生命周期进行刷新

这个时候另一个方法就派上用处了 我们的主题之一:onHiddenChanged()

@Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);

        if (hidden) {   // 不在最前端显示 相当于调用了onPause();

            //做一些事情 你懂得

            return;
        }else{  // 在最前端显示 相当于调用了onResume();
           //数据刷新做一些自己的事情--你懂得
        }
    }

3、setUservisibleHint()

使用场景:当fragment结合viewpager使用的时候 这个方法会调用

这个方法是在oncreateView之前使用 不要使用控件

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (getUserVisibleHint()) {
   //界面可见(相当于Fragment的onResume)
    } else {
//界面不可见 相当于onpause
    }

	// 或者下面这种
	// super.setUserVisibleHint(isVisibleToUser);
    // if (isVisibleToUser) {
	//     isVisable = true;
    //     //相当于Fragment的onResume
    // } else {
    // 	isVisable = false;
    //  	//相当于Fragment的onPause
    // }
}

总结

onhiddenchanged()

用FragmentTransaction来控制fragment的hide和show时,那么这个方法就会被调用。每当你对某个Fragment使用hide或者是show的时候,那么这个Fragment就会自动调用这个方法。

(使用情况:你自己去管理Fragment,而不是用viewpager管理的时候)

setUserVisibleHin()

在使用viewpager的时候,viewpager内部有个提前缓存的机制(默认是提前缓存一页),比如你在看第一个Fragment的时候,隔壁的Fragment已经创建好了,但此时的状态却是不可见的。

但是这时候Fragment不会去调用上面说的onhiddenchanged方法,只会调用setUserVisibleHint这个方法。

关于Frangment的唤醒判断
  • 当使用add,replace来切换Fragment时,Fragment显示隐藏的生命周期就是onCreate,onDetach;

  • 当使用hide,show来切换Fragment时,Fragment显示隐藏不会触动Fragment的生命周期,不过也有其他方法可以监听,那就是onHiddenChanged方法;

  • 当使用ViewPager来切换Fragment时,Fragment显示隐藏不会触动Fragment的生命周期,也不会触动onHiddenChanged方法,这时候可以使用setUserVisibleHint方法来监听;

参考

fragment 切换判断界面是否可见 setUserVisibleHint和onHiddenChanged使用场景

在使用Fragment过程中遇到的坑(一)切换判断界面是否可见,关于onhiddenchanged和setUserVisibleHint函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值