同一个fragment 在不重新创建的情况下怎么切换两个xml布局
时间: 2024-03-16 16:45:28 浏览: 125
如果要在不重新创建 Fragment 的情况下切换布局,可以通过 `ViewStub` 来实现。
`ViewStub` 是一个轻量级的视图,它可以被声明在布局文件中但不会立即被加载。当你需要使用它时,它会被填充并替换成你指定的布局文件。
具体实现方法如下:
1. 在 Fragment 的布局文件中添加 `ViewStub`。
```xml
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ViewStub
android:id="@+id/stub"
android:layout="@layout/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
```
2. 在 Fragment 中定义 `ViewStub` 和两个布局文件对应的布局 ID。
```java
private ViewStub mViewStub;
private View mInflatedView1;
private View mInflatedView2;
```
3. 在 `onCreateView()` 方法中获取 `ViewStub` 并设置它的监听器。
```java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, container, false);
mViewStub = view.findViewById(R.id.stub);
mViewStub.setOnInflateListener(new ViewStub.OnInflateListener() {
@Override
public void onInflate(ViewStub stub, View inflated) {
if (inflated.getId() == R.id.layout1) {
mInflatedView1 = inflated;
} else {
mInflatedView2 = inflated;
}
}
});
return view;
}
```
4. 在需要切换布局的地方调用 `inflate()` 方法。
```java
if (mInflatedView1 == null) {
mViewStub.setLayoutResource(R.layout.layout1);
mInflatedView1 = mViewStub.inflate();
} else {
mViewStub.setLayoutResource(R.layout.layout2);
mInflatedView2 = mViewStub.inflate();
}
```
这样就可以在同一个 Fragment 中通过 `ViewStub` 来切换不同的布局文件了。
阅读全文