膨胀多个布局

Upv*_*ote 3 android android-layout layout-inflater

在片段中,除了根布局之外,我还尝试扩展两个布局:

View a, b;

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

     View root = inflater.inflate(R.layout.list_fragment, container, false);

    //..
    a = inflater.inflate(R.layout.empty_list_view, container);
    b = inflater.inflate(R.layout.progress_list_view, container);
    //..

    return root;
}

public void showB() {
    a.setVisibility(GONE);
    b.setVisibility(VISIBLE);
}
Run Code Online (Sandbox Code Playgroud)

所以我只从 onCreateView 方法返回一个布局。但是我又充气了两个,a 和 b。

然而,当我显示b实际上一个将被显示。所以progress_list_view 永远不会出现。有人可以解释这种奇怪的行为吗?

我怀疑 a 和 b 都被添加到容器(ViewGroup)中。因为 a 是先添加的,所以会先显示。

Bud*_*ius 5

编辑:

关键是,你做的一团糟,而且你没有充分的理由这样做。

发生的事情是你膨胀了根,但没有用这条线把它附加到容器上 View root = inflater.inflate(R.layout.list_fragment, container, false);

然后你膨胀两个视图并将它们直接添加到带有这些行的容器中,a = inflater.inflate(R.layout.empty_list_view, container);根据 Fragment 文档,这是错误的做法:

该片段不应添加视图本身,但这可用于生成视图的 LayoutParams

也都ab是相同的对象,这是container对象为每文档的LayoutInflater

如果提供了 root,则这是根

和 root 是由你提供的,它是container,所以你所拥有的基本上与a=container; b=container;

然后你返回root,此时我真的不知道由于这个混乱而发生了什么。我描述。

幸运修复很容易:

创建另一个这样的 XML 布局(缩短):

<FrameLayout>
    <include layout="@layout/empty_list_view"/>
    <include layout="@layout/progress_list_view"/>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

然后你膨胀这个新的 XML:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     View root = inflater.inflate(R.layout.new_xml, container, false);
    a = root.findViewById( .. ID of the root of empty_list_view.. )
    b = root.findViewById( .. ID of the root of progress_list_view.. )
    return root;
}
Run Code Online (Sandbox Code Playgroud)

那么代码将起作用。

原答案:

没有什么奇怪的行为。你夸大了这些布局,你有 2 个View代表它们的对象。但是没有将它们附加Views到 UI 上。

仅从onCreateView将附加到设备 UI的方法返回的视图。

例如:

以下代码将显示a

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //..
    View a = inflater.inflate(R.layout.empty_list_view, container);
    View b = inflater.inflate(R.layout.progress_list_view, container);
    //..
    return a;
}
Run Code Online (Sandbox Code Playgroud)

以下代码将显示b

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //..
    View a = inflater.inflate(R.layout.empty_list_view, container);
    View b = inflater.inflate(R.layout.progress_list_view, container);
    //..
    return b;
}
Run Code Online (Sandbox Code Playgroud)

如果你想把它们放在一起,你应该把它们放在 XML 布局文件中。include如果您需要可重复使用,也许可以使用标签。