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 是先添加的,所以会先显示。
编辑:
关键是,你做的一团糟,而且你没有充分的理由这样做。
发生的事情是你膨胀了根,但没有用这条线把它附加到容器上 View root = inflater.inflate(R.layout.list_fragment, container, false);
然后你膨胀两个视图并将它们直接添加到带有这些行的容器中,a = inflater.inflate(R.layout.empty_list_view, container);根据 Fragment 文档,这是错误的做法:
该片段不应添加视图本身,但这可用于生成视图的 LayoutParams
也都a和b是相同的对象,这是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如果您需要可重复使用,也许可以使用标签。
| 归档时间: |
|
| 查看次数: |
11274 次 |
| 最近记录: |