frament 是否对用户可见

项目中引用了他人写的lazyloadfragment,博客上写的很牛逼,用起来却真的不咋地。

主要的方法:就是在oncreateView 里面调用它

   private void isCanLoadData() {
        if (!isInit) {
            return;
        }

        if (getUserVisibleHint()) {
            lazyLoad();
            isLoad = true;
            initUpdateTime();
        } else {
            if (isLoad) {
                stopLoad();
            }
        }
    }
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(setContentView(), container, false);
        isInit = true;
        /**初始化的时候去加载数据**/
        mUiStatusController = UiStatusController.get();
        mUiStatusController.bind(view.findViewById(getUiControllerBindView()));
        isCanLoadData();
        return view;
    }
   /**
     * 视图是否已经对用户可见,系统的方法
     * 只有fragment 切换的时候才会调用
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isCanLoadData();
        LogUtils.i("isVisibleToUser = " + isVisibleToUser);
    }

 

以上大概是这个fragment的全部精髓吧,但其实说是lazyLoad 就是在 oncreateView 里面加载数据,不知道大家以前是怎么写的,但是一般人都会在这里去发网络请求吧,不理解这怎么就成懒加载了?应该没有人会在fragment 初始化之前去加载数据吧。

另外一个值得吐槽的地方,感觉自己被误导了,就是这个 setUserVisibleHint,

试了一下,魅族真机测试,无论我怎么切换这个方法都没有被调用!!!查了一下,说好像只有ViewPager+Fragment 才有用,也就是说一般的activity+fragment并不适用。

我的项目里面有几个banner,需要手动暂停和开启,因为都是fragment 只要activity 执行onpause 和 onresume 所有的fragment 都会执行,那些原本在fragment 切换的时候暂停的banner 也会在onresume 开启。

解决办法

fragment 自带有一个 isVisible 方法

  @Override
    public void onResume() {
        super.onResume();
        if (mAutoScrollBanner != null && bannerPaused && isVisible()) {
            mAutoScrollBanner.startAutoPlay();
            bannerPaused = false;
        }
    }
    @Override
    public void onPause() {
        super.onPause();
        if (mAutoScrollBanner != null && isVisible()) {
            mAutoScrollBanner.stopAutoPlay();
            bannerPaused = true;
        }
    }

暂时这样改没什么问题!其他在fragment 正常切换的时候也需要stop和start,我是写在onhidden change里面的

   @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (hidden) {
            Log.i(TAG, "onHiddenChanged: ");
            mAutoScrollBanner.stopAutoPlay();
        } else {
            tryToStartBanner();
        }
    }
    private void tryToStartBanner() {
        try {
            mAutoScrollBanner.resumeVideo();
            mAutoScrollBanner.startAutoPlay();
        } catch (Exception e) {
            initDatas();
        }
    }

这个banner 有个坑,哎,用别人的东西到处都是坑,有时候会出现没有数据的情况,可能被回收了吧,会报数组下标越界。

看到有人自己封装一个 fragment 的可见监听,去监听onstart onresume 等等,没有深入研究,感觉只要在你觉得需要回调的地方把isvisible 回调给自定义的监听器即可,比如 onHiddenChange onstop(不可见) onresume(可见)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值