在Android中使用ChildFragmentManager时,片段替换不起作用

时间:2013-07-09 09:28:54

标签: android android-fragments fragment android-fragmentactivity

我想将一个片段作为孩子添加到另一个片段中 我正在使用 ChildFragmentManager

这是我的ChildFragmentManagerActivity.java
ChildFragment.java
ParentFragment.java
其布局如下 activity_childfragmentmanager.xml
layout_parentfragment.xml
layout_childfragment.xml

我能够成功添加 ParentFragment 。请检查下面的图像
 parent_fragment.png

但是当我尝试添加 ChildFragment 时,它显示如下
 child_fragment

我希望通过替换先前的布局来将子片段添加为内容 提前致谢

1 个答案:

答案 0 :(得分:4)

事务不会删除将用于事务的容器中已存在的视图。要删除这些视图,您需要将ParentFragment的初始内容包装为片段,并将其替换为子片段(使用replace事务而不是add事务)。我对您的代码进行了一些更改,请在下面查看:

ParentFragment:

public class ParentFragment extends Fragment {

private static final int CONTAINER_ID = 0x2222;
private static final String INITIAL_FRAG = "initial_fragment";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    FrameLayout wrapper = new FrameLayout(getActivity());
    wrapper.setId(CONTAINER_ID);
    // look for our two possible fragments, if we don't find the
    // InitialContentFragment add it
    if (getChildFragmentManager().findFragmentByTag(INITIAL_FRAG) == null) {
        InitialContentFragment initContent = new InitialContentFragment();
        Bundle args = new Bundle();
        args.putString("text",
                "I'm the initial content fragment in the parent fragment");
        initContent.setArguments(args);
        getChildFragmentManager().beginTransaction()
                .add(CONTAINER_ID, initContent, INITIAL_FRAG).commit();
    }
    return wrapper;
}

public void requestFragmentTransaction() {
    FragmentTransaction fragmentTransaction = getChildFragmentManager()
            .beginTransaction();
    ChildFragment childFragment = new ChildFragment();
    Bundle args = new Bundle();
    args.putString("text", "Hi I am Child Fragment");
    childFragment.setArguments(args);
    fragmentTransaction.replace(CONTAINER_ID, childFragment, "ChildFragment");
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();

}

}

InitialContentFragment所在的位置:

public static class InitialContentFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // inflate the layout file that would normally be in the
        // ParentFragment at start
        View view = inflater.inflate(R.layout.layout_parentfragment,
                container, false);
        Bundle bundle = getArguments();
        final String text = bundle.getString("text");
        TextView textView = (TextView) view.findViewById(R.id.textView1);
        textView.setText(text);
        Button button = (Button) view.findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                ParentFragment parent = (ParentFragment) InitialContentFragment.this
                        .getParentFragment();
                parent.requestFragmentTransaction();
            }
        });
        return view;
    }
}

作为旁注,不要像你那样忽略try-catch块。