地图片段。扩充布局时:java.lang.IllegalStateException:片段已添加
MapFragment. When inflating a layout: java.lang.IllegalStateException: Fragment already added
我收到下一个错误:java.lang.IllegalStateException:片段已添加。
这是我每次更改标签时都会膨胀的布局,如这张照片所示:
![FirstTab]http://prntscr.com/h4e8pc
![第二个标签]http://prntscr.com/h4ebyn
所以我明白了这个问题,但我已经尝试了很多方法来修复它,但没有结果。我尝试使用 .replace
而不是 .add
,这样它就不会崩溃,但地图不会加载。并且还尝试在我切换到该选项卡后立即删除该片段,但结果与 .replace
相似。
case R.id.navigation_dashboard:
frame = (FrameLayout) findViewById(R.id.content);
frame.removeAllViewsInLayout();
LayoutInflater.from(getApplicationContext())
.inflate(R.layout.activity_prueba_dashboard, frame, true);
fragmentTransaction =
getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.content2, mMapFragment);
fragmentTransaction.commit();
mMapFragment.getMapAsync(my_maps_class);
您看到您正在尝试替换同一片段的内容,在这种情况下您不需要 FragmentTransaction。
解决方案是创建您拥有地图的第二个片段,在这种情况下需要交易。
我相信在那种情况下使用 viewpager 会更干净。检查此代码:
public class HomeViewPagerAdapter extends FragmentPagerAdapter {
public static final int FRAGMENT_A_INDEX = 0;
public static final int FRAGMENT_B_INDEX = 1;
public static final int FRAGMENT_C_INDEX = 2;
public static final int FRAGMENTS_COUNT = 3;
public HomeViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case FRAGMENT_A_INDEX:
return FragmentA.newInstance();
case FRAGMENT_B_INDEX:
return FragmentB.newInstance();
case FRAGMENT_C_INDEX:
return FragmentC.newInstance();
default:
return null;
}
}
@Override
public int getCount() {
return FRAGMENTS_COUNT;
}
}
然后 link 托管应用程序中带有 ViewPager 的适配器 activity 如下所示:
HomeViewPagerAdapter homeTabsAdapter = new HomeViewPagerAdapter(getSupportFragmentManager());
homeTabsViewPager.setAdapter(homeTabsAdapter);
并且您可以通过调用在片段之间轻松切换:
homeTabsViewPager.setCurrentItem(HomeViewPagerAdapter.FRAGMENT_A_INDEX, false);
我收到下一个错误:java.lang.IllegalStateException:片段已添加。
这是我每次更改标签时都会膨胀的布局,如这张照片所示:
![FirstTab]http://prntscr.com/h4e8pc
![第二个标签]http://prntscr.com/h4ebyn
所以我明白了这个问题,但我已经尝试了很多方法来修复它,但没有结果。我尝试使用 .replace
而不是 .add
,这样它就不会崩溃,但地图不会加载。并且还尝试在我切换到该选项卡后立即删除该片段,但结果与 .replace
相似。
case R.id.navigation_dashboard:
frame = (FrameLayout) findViewById(R.id.content);
frame.removeAllViewsInLayout();
LayoutInflater.from(getApplicationContext())
.inflate(R.layout.activity_prueba_dashboard, frame, true);
fragmentTransaction =
getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.content2, mMapFragment);
fragmentTransaction.commit();
mMapFragment.getMapAsync(my_maps_class);
您看到您正在尝试替换同一片段的内容,在这种情况下您不需要 FragmentTransaction。
解决方案是创建您拥有地图的第二个片段,在这种情况下需要交易。
我相信在那种情况下使用 viewpager 会更干净。检查此代码:
public class HomeViewPagerAdapter extends FragmentPagerAdapter {
public static final int FRAGMENT_A_INDEX = 0;
public static final int FRAGMENT_B_INDEX = 1;
public static final int FRAGMENT_C_INDEX = 2;
public static final int FRAGMENTS_COUNT = 3;
public HomeViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case FRAGMENT_A_INDEX:
return FragmentA.newInstance();
case FRAGMENT_B_INDEX:
return FragmentB.newInstance();
case FRAGMENT_C_INDEX:
return FragmentC.newInstance();
default:
return null;
}
}
@Override
public int getCount() {
return FRAGMENTS_COUNT;
}
}
然后 link 托管应用程序中带有 ViewPager 的适配器 activity 如下所示:
HomeViewPagerAdapter homeTabsAdapter = new HomeViewPagerAdapter(getSupportFragmentManager());
homeTabsViewPager.setAdapter(homeTabsAdapter);
并且您可以通过调用在片段之间轻松切换:
homeTabsViewPager.setCurrentItem(HomeViewPagerAdapter.FRAGMENT_A_INDEX, false);