Android在活动视图中附加片段得到片段已经添加了错误

时间:2016-11-25 04:57:46

标签: android android-fragments

在我的活动中,我有简单的FrameLayout小部件,我正在尝试通过replace将简单片段附加到嵌套片段,但是当我使用时会出现Fragment already added错误尝试在嵌套片段中添加一些片段,例如这是我的活动:

public class MainActivity extends AppCompatActivity {

    private CarouselFragment carouselFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ...

        if (savedInstanceState == null) {
            initScreen();

        } else {
            carouselFragment = (CarouselFragment) getSupportFragmentManager().getFragments().get(0);
        }

        ...
    }

    private void initScreen() {
        carouselFragment = new CarouselFragment();

        final FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.container, carouselFragment)
                .commit();
    }
}

和嵌套片段是CarouselFragment class:

在这个片段中我试图将一些其他片段设置为适配器以使用它们

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_carousel, container, false);

    ButterKnife.bind(this, view);

    context = getContext();
    viewPager = (ViewPagerCustomDuration) view.findViewById(R.id.vp_pages);

    adapter = new CarouselViewPagerAdapter(getChildFragmentManager());

    adapter.addFragment(new FragmentA());
    adapter.addFragment(new FragmentB());

    viewPager.setAdapter(adapter);

    viewPager.setPageMargin(50);
    viewPager.setOffscreenPageLimit(3);
    viewPager.setScrollDurationFactor(4);
    viewPager.setOffscreenPageLimit(1);

    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

}

然后这是我的适配器:

public class CarouselViewPagerAdapter extends FragmentStatePagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();

    public CarouselViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return null;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        mFragmentList.add(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        mFragmentList.remove(position);
        super.destroyItem(container, position, object);
    }

    public Fragment getRegisteredFragment(int position) {
        return mFragmentList.get(position);
    }
}

问题在于这行代码:

    adapter.addFragment(new FragmentA());
    adapter.addFragment(new FragmentB());

1 个答案:

答案 0 :(得分:1)

您只能替换通过FragmentTransaction动态添加的片段。

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);  
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit(); 

尝试使用教程: - http://sapandiwakar.in/replacing-fragments/

看看这个: - Replacing a fragment with another fragment inside activity group

希望这会对你有所帮助。