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

时间:2019-08-06 06:34:14

标签: 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);
    }
}

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

myPagerAdapter.removeFragment(viewPager.getCurrentItem());

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

@Override
public int getItemPosition (Object object) {
    int index = mFragmentList.indexOf (object);
    if (index == -1)
        return POSITION_NONE;
    else
        return index;
}

2 个答案:

答案 0 :(得分:0)

尝试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() }
            }
        }

答案 1 :(得分:0)

希望这还不算太晚 发生异常是因为您没有访问连接到片段的正确片段管理器,因此应使用

    YourFragment.fragmentManager?.beginTransaction()!!.remove(YourFragment as Fragment).commitNowAllowingStateLoss()

抱歉,kotlin尝试转换回Java