Android,Fragment层次结构的问题

时间:2017-06-05 11:46:36

标签: java android android-fragments

我目前有一个带有视图寻呼机的片段,其三个孩子中的一个有一个带有可选项目的回收者视图,当选择一个项目时,另一个带有回收者视图的片段被显示(它是一个独立的片段,没有在同一个视图中显示寻呼机)。

My situation is this

我要做的是用F1中的F2代替F1。当调用F2.onCreateView()时,我得到了这个错误:

“java.lang.IllegalStateException:指定的子节点已经有父节点。您必须首先在子节点的父节点上调用removeView()。”

为了向FragmentPagerAdapter提供FragmentManager,F1启动时会调用F1.getChildFragmentManger()。

我正在遵循的步骤“当从F1,1中选择一个项目时”是:

1)获取父片段

2)从父片段

获取FragmentManager

3)用F2替换父片段(F1)。

我怀疑问题是我试图改变片段的方式,我也尝试过,总是从F1,1,直接从活动中获取FragmentManager。我知道,也许这是一个非常糟糕的主意,但我不得不尝试一下......

这是从回收站视图中选择项目时调用的F1,1方法。

@Override
public void navigateToProductListView(Vendor vendor, Category category) {
    Bundle argument = new Bundle();
    argument.putParcelable(Vendor.TAG, vendor);
    argument.putParcelable(Category.TAG, category);

    FragmentManager fragmentManager = getParentFragment().getFragmentManager();

    ProductListFragment productListFragment = (ProductListFragment) fragmentManager.findFragmentByTag(ProductListFragment.TAG);

    if (productListFragment == null) {
        productListFragment = new ProductListFragment();
        Log.i("ProductListFragment", "was null");
    }

    productListFragment.setArguments(argument);
    Transitions.replaceFragment(fragmentManager, productListFragment, ProductListFragment.TAG, true);
}

和F2的onCreateView()抛出异常

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.fragment_product_list, container, false);

    mUnbinder = ButterKnife.bind(this, root);

    ListHelper.init(getActivity(), mRecyclerView);

    Log.i("ProductListFragment","onCreateView()");

    return root;
}

这是我的Transitions类的代码,我只使用一个活动,因此用于保存片段的FrameLayout始终是相同的

public static void replaceFragment(FragmentManager fragmentManager, Fragment fragment, String tag, boolean addToBackStack) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        Slide enterTransition = new Slide(Gravity.BOTTOM);
        enterTransition.setDuration(500);
        fragment.setEnterTransition(enterTransition);
        fragment.setAllowEnterTransitionOverlap(false);
    }

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fragment, tag);
    if (addToBackStack) {
        fragmentTransaction.addToBackStack(null);
    }
    fragmentTransaction.commit();
}

1 个答案:

答案 0 :(得分:0)

<div id="my"> <div>This div element has a top margin of 100px, a right margin of 150px, a bottom margin of 100px, and a left margin of 80px.</div> </div>此语句为您提供父私有FragmentManager,用于放置和管理此Fragment中的Fragment。 试试这个FragmentManager fragmentManager = getParentFragment().getFragmentManager();