替换 ViewPager 中的片段导致 IllegalStateException
Replacing fragment in ViewPager causes IllegalStateException
在 this example 之后,我正在尝试在 ViewPager 的单个选项卡中将一个片段替换为另一个片段。我收到此异常:
java.lang.IllegalStateException: Can't change tag of fragment DailyWordFragment
class ViewPagerAdapter extends FragmentPagerAdapter {
private final FragmentManager fragmentManager;
Fragment fragment;
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
fragmentManager = manager;
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
if(fragment == null){
fragment = DailyWordFragment.newInstance();
}
return fragment;
case 1:
if(fragment == null){
fragment = WordListFragment.newInstance(new WordListFragment.OnWordItemAddListener() {
@Override
public void onWordItemAddListener() {
fragmentManager.beginTransaction().remove(fragment).commit();
fragment = AddWordFragment.newInstance();
notifyDataSetChanged();
}
});
}
return fragment;
default:
return null;
}
}
@Override
public int getItemPosition(Object object) {
if(object instanceof WordListFragment && fragment instanceof AddWordFragment)
return POSITION_NONE;
return POSITION_UNCHANGED;
}
@Override
public int getCount() {
return 2;
}
}
根据其他帖子,此异常似乎是由于重复添加相同片段或错误计算片段数量引起的,但我根本看不出这两种情况发生在哪里?显然我错过了一些东西。我将不胜感激任何帮助。谢谢。
您在初始化Fragment之前是否尝试过将其设置为null?
@Override
public Fragment getItem(int position) {
fragment = null
switch (position){
case 0:
if(fragment == null){
fragment = DailyWordFragment.newInstance();
}
return fragment;
case 1:
if(fragment == null){
fragment = WordListFragment.newInstance(new WordListFragment.OnWordItemAddListener() {
@Override
public void onWordItemAddListener() {
fragmentManager.beginTransaction().remove(fragment).commit();
fragment = AddWordFragment.newInstance();
notifyDataSetChanged();
}
});
}
return fragment;
default:
return null;
}
}
要在 View Pager 的一个选项卡中交换片段,您必须以不同的方式进行:
您需要在 ViewPager 中充当容器的片段。它由 ViewPager 管理。此 Fragment 始终存在于选项卡中,从不交换或更改。
在该片段中,您有 2 个子片段,您可以使用 ChildFragmentManager 的事务来交换它们。但是 ViewPager 甚至不知道它们的存在。
在 this example 之后,我正在尝试在 ViewPager 的单个选项卡中将一个片段替换为另一个片段。我收到此异常:
java.lang.IllegalStateException: Can't change tag of fragment DailyWordFragment
class ViewPagerAdapter extends FragmentPagerAdapter {
private final FragmentManager fragmentManager;
Fragment fragment;
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
fragmentManager = manager;
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
if(fragment == null){
fragment = DailyWordFragment.newInstance();
}
return fragment;
case 1:
if(fragment == null){
fragment = WordListFragment.newInstance(new WordListFragment.OnWordItemAddListener() {
@Override
public void onWordItemAddListener() {
fragmentManager.beginTransaction().remove(fragment).commit();
fragment = AddWordFragment.newInstance();
notifyDataSetChanged();
}
});
}
return fragment;
default:
return null;
}
}
@Override
public int getItemPosition(Object object) {
if(object instanceof WordListFragment && fragment instanceof AddWordFragment)
return POSITION_NONE;
return POSITION_UNCHANGED;
}
@Override
public int getCount() {
return 2;
}
}
根据其他帖子,此异常似乎是由于重复添加相同片段或错误计算片段数量引起的,但我根本看不出这两种情况发生在哪里?显然我错过了一些东西。我将不胜感激任何帮助。谢谢。
您在初始化Fragment之前是否尝试过将其设置为null?
@Override
public Fragment getItem(int position) {
fragment = null
switch (position){
case 0:
if(fragment == null){
fragment = DailyWordFragment.newInstance();
}
return fragment;
case 1:
if(fragment == null){
fragment = WordListFragment.newInstance(new WordListFragment.OnWordItemAddListener() {
@Override
public void onWordItemAddListener() {
fragmentManager.beginTransaction().remove(fragment).commit();
fragment = AddWordFragment.newInstance();
notifyDataSetChanged();
}
});
}
return fragment;
default:
return null;
}
}
要在 View Pager 的一个选项卡中交换片段,您必须以不同的方式进行:
您需要在 ViewPager 中充当容器的片段。它由 ViewPager 管理。此 Fragment 始终存在于选项卡中,从不交换或更改。
在该片段中,您有 2 个子片段,您可以使用 ChildFragmentManager 的事务来交换它们。但是 ViewPager 甚至不知道它们的存在。