【问题标题】:Cannot setMaxLifecycle for Fragment not attached to FragmentManager: ViewPager无法为未附加到 FragmentManager 的 Fragment 设置MaxLifecycle:ViewPager
【发布时间】:2019-08-06 06:34:14
【问题描述】:

我已经尝试了这么多给定的例子,但对我没有任何帮助。当我尝试从 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;
}

【问题讨论】:

标签: android android-fragments android-viewpager fragmentmanager


【解决方案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() }
            }
        }

【讨论】:

    【解决方案2】:

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

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

    抱歉,kotlin 尝试转换回 java

    【讨论】:

      猜你喜欢
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多