繁体   English   中英

地图片段。 膨胀布局时:java.lang.IllegalStateException: Fragment already added

[英]MapFragment. When inflating a layout: java.lang.IllegalStateException: Fragment already added

我收到下一个错误:java.lang.IllegalStateException: Fragment already added。

这是每次更改选项卡时都会膨胀的布局,如下图所示:

![FirstTab] http://prntscr.com/h4e8pc

![SecondTab] 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);

您看到尝试替换同一 Fragment 的内容,在这种情况下,您不需要 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;
    }
}

然后将适配器与托管 appcompat 活动中的 ViewPager 链接,如下所示:

HomeViewPagerAdapter homeTabsAdapter = new HomeViewPagerAdapter(getSupportFragmentManager());
homeTabsViewPager.setAdapter(homeTabsAdapter);

您可以通过调用在片段之间轻松切换:

homeTabsViewPager.setCurrentItem(HomeViewPagerAdapter.FRAGMENT_A_INDEX, false);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM