片段布局在更换时影响持久性

时间:2015-12-03 16:42:44

标签: android xml android-layout android-fragments

我有点像Android碎片的菜鸟,所以希望有人可以轻松指出我的错误。我从头开始构建一个非ActionBar应用程序,以获得一个包含三个片段的MainActivity(使用在线教程)。我的片段由MainActivity上的三个按钮控制,此片段持有者和按钮的XML为:

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <fragment
        android:id="@+id/theFragment"
        android:name="org.mypackage.FragmentOne"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <LinearLayout
        android:id="@+id/bottomSection"
        android:layout_width="fill_parent"
        android:layout_height="70.0dip"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom"
        android:background="@android:color/white"
        android:orientation="horizontal">

        <RelativeLayout
            android:id="@+id/relativeLayout1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/white">

            <ImageButton
                android:id="@+id/button1"
                android:layout_width="50dip"
                android:layout_height="50dip"
                android:layout_alignParentLeft="true"
                android:layout_marginBottom="7dip"
                android:layout_marginLeft="50dip"
                android:layout_marginTop="8dip"
                android:adjustViewBounds="true"
                android:background="@null"
                android:onClick="selectFrag"
                android:scaleType="fitCenter"
                android:src="@drawable/offerbutton" />

            <ImageButton
                android:id="@+id/button3"
                android:layout_width="50dip"
                android:layout_height="50dip"
                android:layout_alignParentRight="true"
                android:layout_marginBottom="7dip"
                android:layout_marginRight="50dip"
                android:layout_marginTop="8dip"
                android:adjustViewBounds="true"
                android:background="@null"
                android:onClick="selectFrag"
                android:scaleType="fitCenter"
                android:src="@drawable/talkbutton" />
        </RelativeLayout>
    </LinearLayout>

    <ImageButton
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:layout_margin="5dip"
        android:background="@android:color/transparent"
        android:onClick="selectFrag"
        android:padding="20dip"
        android:paddingRight="20dip"
        android:src="@drawable/floatingbutton"
        android:text="Floating Button" />
</FrameLayout>
</RelativeLayout>

这些按钮在MainActivity中调用一个简单的selectFrag方法:

public void selectFrag(View view) {
    Fragment fr;
    switch (view.getId()) {
        case R.id.button1:
            fr = new FragmentOne();
            break;
        case R.id.button2:
            fr = new FragmentTwo();
            break;
        case R.id.button3:
            fr = new FragmentThree();
            break;
        default:
            fr = new FragmentOne();
            break;
    }
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.theFragment, fr);
    ft.addToBackStack(null);
    ft.commit();
}

我开发了Fragment2和Fragment3,两者都具有中等复杂的XML布局,并且它们工作正常(按下按钮2,Fragment1消失,Fragment2出现,按钮3也相同)。我现在正在研究Fragment1的布局。目前,这是一个简单的持有人布局:

fragment_one.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="This is fragment No.1"
    />
</LinearLayout>

问题:当我尝试使fragment_one.xml更复杂时(包括新的LinearLayouts和其中的视图等),当我单击按钮移动到Fragment2或Fragment3时,此布局将永久显示在屏幕上。总之,Fragment2或Fragment3并没有完全删除Fragment1的布局。 Fragment2或3成功显示在屏幕上,但在“This is fragment No.1”textView。

下面

我被困住了。有任何想法吗?我尝试使用<FrameLayout/>代替<fragment/>,但没有快速到达任何地方......

1 个答案:

答案 0 :(得分:1)

这是正常行为。您实际上并没有替换片段,而更像是将它放在前一个片段之上。您可以做的是将片段2中的背景颜色设置为白色(或者您在应用程序中使用的默认背景),以便绘制片段1。

来自android documentation

  

通过在布局XML文件中定义片段将片段添加到活动布局时,无法在运行时删除片段。如果您计划在用户交互期间将片段交换进出,则必须在活动首次启动时将片段添加到活动中,如下一课所示。

SO question

中还有更多相关信息