从片段替换片段会导致片段内容重叠

时间:2015-02-24 00:33:02

标签: android android-layout android-fragments

我在片段中有一个ListView。当我单击列表上的项目时,我想使用替换“启动”一个新的片段。这是结果。我应该只得到 BUTTON

enter image description here

这是在 onItemClick:

Fragment nextFrag= new VitaminFragment();
FragmentTransaction transaction = this.getFragmentManager().beginTransaction();

transaction.replace(vitamin_fragment.getId(), nextFrag);
transaction.addToBackStack(null);
transaction.commit();

在VitaminFragment的onCreateView:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.d("created", "vitamin_fragment_2");
    return inflater.inflate(R.layout.supplement_properties_layout, container, false);
}

和VitaminFragment XML(supplement_properties_layout)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button2"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="77dp" />

    <com.astuetz.PagerSlidingTabStrip
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_height="48dip" />

    <android.support.v4.view.ViewPager
        android:id="@+id/supplements_properties_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/tabs" />

</RelativeLayout>

以编程方式创建VitaminWiki的布局:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        final View result = initComponents();
       .....
       .....
}


   private RelativeLayout initComponents() {

        vitamin_fragment = new RelativeLayout(getActivity());
        vitamin_fragment.setId(View.generateViewId());
        RelativeLayout.LayoutParams layout_57 = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);

        vitamin_fragment.setLayoutParams(layout_57);

        ListView listView = new ListView(getActivity());
        ......
        vitamin_fragment.addView(listView);

        com.astuetz.PagerSlidingTabStrip p = new PagerSlidingTabStrip(getActivity());
        ...........
        p.setLayoutParams(params);
        vitamin_fragment.addView(p);

        ViewPager viewPager = new ViewPager(getActivity());
        .........
        vitamin_fragment.addView(viewPager);

        return vitamin_fragment;
    }

最后HERE是附加片段的活动。

1 个答案:

答案 0 :(得分:8)

FragmentTransaction中的replace()方法只是从指定的容器中删除所有片段,然后调用add()。因此,如果指定的容器为空,则replace()只是在当前视图的顶部添加一个片段。

你应该发布维生素片段的XML文件,但我要说你的维生素片段添加背景,你应该没事。

并且不要忘记使片段的主要布局可以点击。否则,点击按钮以外的任何内容都将通过片段,并可能点击ListView上的项目。

你的片段应该是这样的:

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:clickable="true" >

编辑:如果你想让replace()方法工作并从活动中删除ListView,请确保在第一个用于添加第一个片段的容器上调用它。此外,第一个片段需要动态添加。当我说动态添加时,我的意思是使用FragmentTransaction.add()方法。