TabLayout+ViewPager+Fragment, 为什么Fragment不走onHiddenChanged方法

菜熊 2017-08-02 10:16:03
TabLayout+ViewPager+Fragment, 为什么Fragment不走onHiddenChanged方法
...全文
50841 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
le540850072 2020-11-23
  • 打赏
  • 举报
回复
引用 5 楼 little_little_start 的回复:
的确如此,但为什么呢,什么情况下onHidenchanged有效呢
引用 3 楼 ydyww 的回复:
只有FragmentTransaction的show()和hide()方法才会调用onHiddenChanged()方法
3楼说的有效。
HL_GT 2020-11-17
  • 打赏
  • 举报
回复
你是不是要做懒加载
little little star 2020-11-03
  • 打赏
  • 举报
回复
的确如此,但为什么呢,什么情况下onHidenchanged有效呢
柑蕉橘梨禄柚 2018-07-26
  • 打赏
  • 举报
回复
getUserVisibleHint获得当前是否可见
ydyww 2018-07-25
  • 打赏
  • 举报
回复
只有FragmentTransaction的show()和hide()方法才会调用onHiddenChanged()方法
jklwan 2017-08-03
  • 打赏
  • 举报
回复
先设置viewpager的setOffscreenPageLimit为fragment的总数,防止fragment销毁,其次,切换fragment会调用setUserVisibleHint方法,而不是onHiddenChanged。具体看FragmentPagerAdapter中的代码,参考

public abstract class FragmentPagerAdapter extends PagerAdapter {
        ……
        public Object instantiateItem(ViewGroup container, int position) {
        if(this.mCurTransaction == null) {
            this.mCurTransaction = this.mFragmentManager.beginTransaction();
        }

        long itemId = this.getItemId(position);
        String name = makeFragmentName(container.getId(), itemId);
        Fragment fragment = this.mFragmentManager.findFragmentByTag(name);
        if(fragment != null) {
            this.mCurTransaction.attach(fragment);
        } else {
            fragment = this.getItem(position);
            this.mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId));
        }

        if(fragment != this.mCurrentPrimaryItem) {
            fragment.setMenuVisibility(false);
            fragment.setUserVisibleHint(false);
        }

        return fragment;
    }

    public void destroyItem(ViewGroup container, int position, Object object) {
        if(this.mCurTransaction == null) {
            this.mCurTransaction = this.mFragmentManager.beginTransaction();
        }

        this.mCurTransaction.detach((Fragment)object);
    }

    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment)object;
        if(fragment != this.mCurrentPrimaryItem) {
            if(this.mCurrentPrimaryItem != null) {
                this.mCurrentPrimaryItem.setMenuVisibility(false);
                this.mCurrentPrimaryItem.setUserVisibleHint(false);
            }

            if(fragment != null) {
                fragment.setMenuVisibility(true);
                fragment.setUserVisibleHint(true);
            }

            this.mCurrentPrimaryItem = fragment;
        }
    }
}
寒冰大神 2017-08-02
  • 打赏
  • 举报
回复
因为Fragment都是被销毁后新建的,不是原来的

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧