膨胀多个布局
Inflate multiple layouts
在片段中,我尝试膨胀除根布局之外的两个布局:
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);
}
所以我只是 return 来自 onCreateView 方法的单个布局。但是我又给两个充气了,a和b。
然而当我显示b时实际上会显示a。所以 progress_list_view 永远不会出现。有人可以解释这种奇怪的行为吗?
我怀疑a和b都添加到了容器(ViewGroup)中。而且由于先加了a,所以会先显示。
您只能从 onCreateView 中 return 一个视图。 returned 的视图是显示的视图。看起来你总是 return 查看 a.
编辑:
关键是,你正在做一团糟,而且没有充分的理由这样做。
那里发生的事情是你膨胀根,但没有用这条线将它附加到容器 View root = inflater.inflate(R.layout.list_fragment, container, false);
然后你膨胀两个视图并使用这些行 a = inflater.inflate(R.layout.empty_list_view, container);
将它们直接添加到容器中,根据 Fragment 文档,这是错误的做法:
The fragment should not add the view itself, but this can be used to generate the LayoutParams of the view
a
和 b
也是同一个对象,根据 LayoutInflater
的文档,这是 container
对象
If root was supplied, this is the root
而root是你提供的,是container
,所以你的基本和a=container;
一样 b=container;
然后你 return root,此时我真的不知道由于这个混乱而发生了什么。我描述了。
幸运的是修复很容易:
像这样创建另一个 XML 布局(缩短):
<FrameLayout>
<include layout="@layout/empty_list_view"/>
<include layout="@layout/progress_list_view"/>
</FrameLayout>
然后你给这个新的充气 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;
}
那么代码就可以工作了。
原答案:
没有异常行为。您扩充了这些布局,并且有 2 个 View
对象代表它们。但是没有将那些 Views
附加到 UI。
只有您 return 来自 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;
}
以下代码将显示 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;
}
如果你想把它们放在一起,你应该把它们放在一起在 XML 布局文件中。如果您需要可重复使用,也许可以使用 include
标签。
R.layout.list_fragment 应该看起来像这样:
<FrameLayout>
<include
android:id="@+id/a"
layout="@layout/empty_list_view"/>
<include
android:id="@+id/b"
layout="@layout/progress_list_view"/>
</FrameLayout>
您的代码将如下所示:
View a, b;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.list_fragment, container, false);
a = root.findViewById(R.id.a);
b = root.findViewById(R.id.b);
return root;
}
public void showB() {
a.setVisibility(GONE);
b.setVisibility(VISIBLE);
}
/** 在首次创建 activity 时调用。 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layoutMain = new LinearLayout(this);
layoutMain.setOrientation(LinearLayout.HORIZONTAL);
setContentView(layoutMain);
LayoutInflater inflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 1st Layout
RelativeLayout layoutLeft = (RelativeLayout) inflate.inflate(
R.layout.main, null);
// 2nd Layout
RelativeLayout layoutRight = (RelativeLayout) inflate.inflate(
R.layout.row, null);
RelativeLayout.LayoutParams relParam = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutMain.addView(layoutLeft, 100, 100);
layoutMain.addView(layoutRight, relParam);
}
为什么不在容器中扩充新视图。
试试这个
LayoutInflater mInflater = null;
ViewGroup mContainer = null;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mInflater = inflater;
mContainer = container;
View root = inflater.inflate(R.layout.list_fragment, container, false);
return root;
}
public void showB() {
mInflater.inflate(R.layout.progress_list_view, mContainer, false);
}
public void showA() {
mInflater.inflate(R.layout.empty_list_view, mContainer, false);
}
在片段中,我尝试膨胀除根布局之外的两个布局:
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);
}
所以我只是 return 来自 onCreateView 方法的单个布局。但是我又给两个充气了,a和b。
然而当我显示b时实际上会显示a。所以 progress_list_view 永远不会出现。有人可以解释这种奇怪的行为吗?
我怀疑a和b都添加到了容器(ViewGroup)中。而且由于先加了a,所以会先显示。
您只能从 onCreateView 中 return 一个视图。 returned 的视图是显示的视图。看起来你总是 return 查看 a.
编辑:
关键是,你正在做一团糟,而且没有充分的理由这样做。
那里发生的事情是你膨胀根,但没有用这条线将它附加到容器 View root = inflater.inflate(R.layout.list_fragment, container, false);
然后你膨胀两个视图并使用这些行 a = inflater.inflate(R.layout.empty_list_view, container);
将它们直接添加到容器中,根据 Fragment 文档,这是错误的做法:
The fragment should not add the view itself, but this can be used to generate the LayoutParams of the view
a
和 b
也是同一个对象,根据 LayoutInflater
container
对象
If root was supplied, this is the root
而root是你提供的,是container
,所以你的基本和a=container;
一样 b=container;
然后你 return root,此时我真的不知道由于这个混乱而发生了什么。我描述了。
幸运的是修复很容易:
像这样创建另一个 XML 布局(缩短):
<FrameLayout>
<include layout="@layout/empty_list_view"/>
<include layout="@layout/progress_list_view"/>
</FrameLayout>
然后你给这个新的充气 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;
}
那么代码就可以工作了。
原答案:
没有异常行为。您扩充了这些布局,并且有 2 个 View
对象代表它们。但是没有将那些 Views
附加到 UI。
只有您 return 来自 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;
}
以下代码将显示 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;
}
如果你想把它们放在一起,你应该把它们放在一起在 XML 布局文件中。如果您需要可重复使用,也许可以使用 include
标签。
R.layout.list_fragment 应该看起来像这样:
<FrameLayout>
<include
android:id="@+id/a"
layout="@layout/empty_list_view"/>
<include
android:id="@+id/b"
layout="@layout/progress_list_view"/>
</FrameLayout>
您的代码将如下所示:
View a, b;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.list_fragment, container, false);
a = root.findViewById(R.id.a);
b = root.findViewById(R.id.b);
return root;
}
public void showB() {
a.setVisibility(GONE);
b.setVisibility(VISIBLE);
}
/** 在首次创建 activity 时调用。 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layoutMain = new LinearLayout(this);
layoutMain.setOrientation(LinearLayout.HORIZONTAL);
setContentView(layoutMain);
LayoutInflater inflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 1st Layout
RelativeLayout layoutLeft = (RelativeLayout) inflate.inflate(
R.layout.main, null);
// 2nd Layout
RelativeLayout layoutRight = (RelativeLayout) inflate.inflate(
R.layout.row, null);
RelativeLayout.LayoutParams relParam = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutMain.addView(layoutLeft, 100, 100);
layoutMain.addView(layoutRight, relParam);
}
为什么不在容器中扩充新视图。
试试这个
LayoutInflater mInflater = null;
ViewGroup mContainer = null;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mInflater = inflater;
mContainer = container;
View root = inflater.inflate(R.layout.list_fragment, container, false);
return root;
}
public void showB() {
mInflater.inflate(R.layout.progress_list_view, mContainer, false);
}
public void showA() {
mInflater.inflate(R.layout.empty_list_view, mContainer, false);
}