无法为未附加到FragmentManager的Fragment设置setMaxLifecycle:ViewPager。

9

我尝试了很多已有的例子,但都没有帮助我解决问题。 当我尝试从viewPager动态地移除一个页面时,我会得到以下异常:

Cannot setMaxLifecycle for Fragment not attached to FragmentManager

我的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);
    }
}

我正在调用方法来删除页面,方法如下:
myPagerAdapter.removeFragment(viewPager.getCurrentItem());

我也尝试了下面给出的方法,但仍然出现异常。
@Override
public int getItemPosition (Object object) {
    int index = mFragmentList.indexOf (object);
    if (index == -1)
        return POSITION_NONE;
    else
        return index;
}

你应该只是提交一个Fragments的错误报告 - 这与你的代码无关。 - ianhanniballake
2个回答

1

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

如果您以某种原因在另一个线程上运行此方法,请确保使用Handler(Looper.getMainLooper()).post { ... }代替。

问题在于,您可能正在执行事务,而ViewPager本身正在处理动画或其自己的状态保存。 执行以上操作使我们能够在进行事务之前完全运行ViewPager的状态保存。

我也遇到了同样的问题,这个方法对我有用。

具体而言,这是我在onPageScrollStateChanged(..)中运行的代码(您可能正在执行相同的操作)

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

0
希望不算太晚。 异常发生的原因是你没有访问与你的片段相关联的正确片段管理器,所以你应该使用。
    YourFragment.fragmentManager?.beginTransaction()!!.remove(YourFragment as Fragment).commitNowAllowingStateLoss()

抱歉,尝试将 Kotlin 转换回 Java。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接