无法为未连接到FragmentManager的Fragment设置MaxLifecycle:ViewPager

Anu*_*iya 5 android android-fragments android-viewpager fragmentmanager

我已经尝试了很多示例,但是对我没有用。当我尝试从viewPager动态删除页面时,出现异常:

无法为未附加到FragmentManager的Fragment设置MaxLifecycle

我的PagerAdapter如下所示:

public class MyPagerAdapter extends FragmentStatePagerAdapter {

    private final Context mContext;
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();
    long baseId = 0;

    public MyPagerAdapter(Context context, FragmentManager fm) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        mContext = context;
    }
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title, int position) {
        mFragmentList.add(position, fragment);
        mFragmentTitleList.add(position, title);
    }

    public void removeFragment(int position) {
        mFragmentList.remove(position);
        mFragmentTitleList.remove(position);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}
Run Code Online (Sandbox Code Playgroud)

并删除页面,我正在调用类似的方法

myPagerAdapter.removeFragment(viewPager.getCurrentItem());
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下给定的方法,但仍然出现异常

myPagerAdapter.removeFragment(viewPager.getCurrentItem());
Run Code Online (Sandbox Code Playgroud)

Dan*_*Kim 1

尝试Handler().post { myPagerAdapter.removeFragment(..) }

如果您出于某种原因在另一个线程上运行此方法,请确保改为 put Handler(Looper.getMainLooper()).post { ... }

问题是,当 ViewPager 本身正在处理动画或它自己的状态保存时,您可能正在执行事务。执行上述操作可以让我们在执行事务之前完全运行 ViewPager 的状态保存。

我遇到了同样的问题,这样做为我解决了问题。

具体来说,这是我在 onPageScrollStateChanged(..) 内部运行的代码(大概您也在做同样的事情)

        override fun onPageScrollStateChanged(state: Int) {
            if (upcomingPage == 0 && state == ViewPager.SCROLL_STATE_IDLE) {
                homePagerRoot?.post { vpAdapter.clearExtraFragments() }
            }
        }
Run Code Online (Sandbox Code Playgroud)