我尝试了很多示例,但对我没有用。当我尝试从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;
}
答案 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