地图片段。扩充布局时: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);