gpt4 book ai didi

Android ViewStub 以编程方式更改布局

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:34 29 4
gpt4 key购买 nike

这是我的用例:

我想在运行时更改我的膨胀布局,比如首先我膨胀布局 a,然后一段时间后我想显示布局 B,然后是布局 C,等等。

我在某处读到,与其在主布局中包含布局然后隐藏/取消隐藏,不如使用 viewstub 和 inflate。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ViewStub
android:id="@+id/layout_stub"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>

我现在的问题是,当我膨胀第一个布局时,它工作正常,但下次当我尝试膨胀第二个布局时,我得到 stub null。

ViewStub stub = (ViewStub) findViewById(R.id.layout_stub);
stub.setLayoutResource(layoutId);
View inflated = stub.inflate();

我的理解是 Viewstub 是一个正在加载布局的容器,如果是的话为什么我在尝试加载第二个布局时没有获得 ViewStub?(所以这意味着当我膨胀第一个布局(A)时,放置 ViewStub 的布局被完全移除了?)

我正在寻找有关使用 Viewstub 或替代方案实现我的用例的任何指示。

最佳答案

A ViewStub是一个占位符,一旦调用 ViewStub.inflate() 就会被膨胀的布局所取代。第二次调用 inflate 没有意义,因为 ViewStub 将不再位于层次结构中。相反,您应该获取对 LinearLayout 的引用,删除其 View ,并将您的第二个布局添加为子布局。

ViewStub stub = (ViewStub) findViewById(R.id.layout_stub);
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
stub.setLayoutResource(layoutId);
stub.inflate(); // inflate 1st layout

ll.removeAllViews(); // remove previous view, add 2nd layout
ll.addView(LayoutInflater.from(context).inflate(secondLayoutId, ll, false));

关于Android ViewStub 以编程方式更改布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37441226/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com