当前位置:网站首页>ViewPager fragments of nested data blank page abnormal problem analysis

ViewPager fragments of nested data blank page abnormal problem analysis

2022-08-09 13:17:00 Xie Dong_

         开题思考:Fragment放ViewPager,ViewPager里面是fragment.第一次进入没问题,再次进入ViewPager的fragment时里面内容就没了,A data blank page exception occurs.

          描述:activityPut two inFragment,Pages to be reviewed respectively、Added page;which is pending reviewfragment中利用viewpager放了三个fragment,All respectively、审核加入、Audit exit,The second switch is pending review、已加入fragment时,will be found pending reviewfragment中ViewPager承载的FragmentData blank pages will appear.如下图所示:

         It feels like it is based on experienceFragmentManager出了问题,因为FragmentManagerThe responsibility is to be responsible for managementFragment,包括对Fragment栈中的Fragement进行添加,删除,替换等操作,Since there is a blank page,肯定是FragmentManager在进行FragmentNot working properly when replacing,查看Fragment以及FragmentActivityThere are three types of source code foundFragmentManager,分别为getFragmentManager、getSupportFragmentManager、getChildFragmentManager;其中getFragmentManager跟getChildFragmentManager在Fragment类中,而getSupportFragmentManager位于FragmentActivity中,而getFragmentManager虽然在Fragment中,But it is mentioned at the end of the official note,如果当前Fragment是另外一个Fragment的子类,则当前FragmentManager属于父类,这就意味着,Although the three are similar, the objects of management are different.

The source code of the three is as follows

getFragmentManager:

    /**
     * Return the FragmentManager for interacting with fragments associated
     * with this fragment's activity.  Note that this will be non-null slightly
     * before {@link #getActivity()}, during the time from when the fragment is
     * placed in a {@link FragmentTransaction} until it is committed and
     * attached to its activity.
     *
     * <p>If this Fragment is a child of another Fragment, the FragmentManager
     * returned here will be the parent's {@link #getChildFragmentManager()}.
     */
    final public FragmentManager getFragmentManager() {
        return mFragmentManager;
    }

getSupportFragmentManager:

    /**
     * Return the FragmentManager for interacting with fragments associated
     * with this activity.
     */
    public FragmentManager getSupportFragmentManager() {
        return mFragments.getSupportFragmentManager();
    }


getChildFragmentManager:


    /**
     * Return a private FragmentManager for placing and managing Fragments
     * inside of this Fragment.
     */
    final public FragmentManager getChildFragmentManager() {
        if (mChildFragmentManager == null) {
            instantiateChildFragmentManager();
            if (mState >= RESUMED) {
                mChildFragmentManager.dispatchResume();
            } else if (mState >= STARTED) {
                mChildFragmentManager.dispatchStart();
            } else if (mState >= ACTIVITY_CREATED) {
                mChildFragmentManager.dispatchActivityCreated();
            } else if (mState >= CREATED) {
                mChildFragmentManager.dispatchCreate();
            }
        }
        return mChildFragmentManager;
    }



       根据google官方的描述(PS:EnglishSelf-translation is out of the question),大意为getFragmentManager、跟getSupportFragmentManagerIs to get manageable and currentActivity有关联的Fragment的FragmentManager,That is to say, the two belong to each otherActivity的,再来看下getChildFragment的官方注释

    /**
     * Return a private FragmentManager for placing and managing Fragments
     * inside of this Fragment.
     */
    final public FragmentManager getChildFragmentManager() {
   

         The above comment roughly means returning a private oneFragmentManager来管理Fragment,它属于Fragment.So far, the whole problem has been sorted out,Because of the question raised in the title of the article,是在Fragment中使用ViewPager装载Fragment,也就是说,在Fragmentshould be used in Fragemnt类中提供的manager方法,即在给ViewPager设置FragmentManager的时候应该使用getChildFragmentManager.

As mentioned in the title of the articleViewPager设置Adapter

 viewPager.setAdapter(new ManageFragmentPagerAdapter(getFragmentManager(), list));

After analysis, it should be modified to

 viewPager.setAdapter(new ManageFragmentPagerAdapter(getChildFragmentManager(), list));

    归纳总结getFragmentManager()所得到的是所在fragment 的父容器的管理器,而getChildFragmentManager()所得到的是在fragment  里面子容器的管理器,即getFragmentManager到的是activity对所包含fragment的Manager,而如果是fragmentLoaded as a containerFragment,就需要利用getChildFragmentManager()了





原网站

版权声明
本文为[Xie Dong_]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/221/202208091203557800.html