片段混淆

时间:2016-06-07 14:34:42

标签: java android xml android-fragments layout

Android developer documentation for fragments说:

  

“注意:通过定义片段将片段添加到活动布局中   在布局XML文件中的片段,您无法删除片段   运行。如果您打算在用户期间将片段交换进出   交互时,必须将片段添加到活动时   活动首先开始,如下一课所示。“

部分原因是我养成了总是使用片段管理器向我的用户界面添加/删除片段的习惯(即使我不想在运行时“热交换”它们)。我100%肯定当我尝试在运行时删除/替换“硬连线”XML片段时,我的应用程序崩溃,但有异常。

我几个月来没有真正使用过XML片段,但是今天,在一个百灵鸟上,我决定玩游戏,我发现我能够将XML片段交换为其他片段......它有效吗?我在网上找不到任何讨论此行为最近变化的内容。它只是有效。

我的布局代码在这里:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fl_frag"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="mobappdev.demo.myapplication.MainActivity">

    <fragment
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:id="@+id/frag"
            android:name="mobappdev.demo.myapplication.BlankFragment"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="@string/click_me"
        android:onClick="clickMe"/>
</LinearLayout>

以下是替换片段的代码:

public void clickMe(View view) {

  FragmentManager manager = getSupportFragmentManager();

  BlankFragment newFrag = BlankFragment.newInstance();
  Fragment oldFrag = manager.findFragmentById(R.id.frag);
  Log.i("TESTING", "old frag is null: " + (oldFrag == null));

  manager.beginTransaction()
    .replace(R.id.fl_frag, newFrag)
    .commit();
}

它没有任何问题。我尝试过各种变体(例如将XML片段放在FrameLayout中),这一切看起来都很好。我甚至尝试过诸如删除/添加之类的变体,只需删除它,所有工作都没有问题。

那么我错过了什么?

1 个答案:

答案 0 :(得分:1)

您不是替换片段本身,而是在该片段之上添加新片段。它只是ID的一个小问题,但你要使用容器上的FragmentManager(LinearLayout)替换而不是在片段本身上进行替换(R.id.fl_frag而不是R.id.frag)