java - 如何以编程方式创建 android ViewStub?
问题描述
我想在ViewStub
我的布局中添加一个。这ViewStub
应该是 xml 的样子:
<ViewStub
android:id="@+id/viewstub_id"
android:layout="@layout/use_this_layout"
android:inflatedId="@+id/inflated_stub"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
我想出了这段代码,但没有显示布局。
我正在重用id
,因为我正在删除并再次添加存根。我猜代码不起作用与约束或布局宽度/高度有关,但我不确定。我究竟做错了什么?
ViewStub vs = new ViewStub(this);
vs.setId(R.id.viewstub_id);
vs.setLayoutResource(R.layout.use_this_layout);
vs.setInflatedId(R.id.inflated_stub);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(0, 0);
vs.setLayoutParams(layoutParams);
ConstraintLayout cl = findViewById(R.id.viewStubWrapper);
ConstraintSet cs = new ConstraintSet();
cs.clone(cl);
cs.connect(ConstraintSet.PARENT_ID, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM);
cs.applyTo(cl);
cl.addView(vs); // the ConstraintLayout is the ViewStub's parent
vs.inflate();
解决方案
我发现了一些似乎有效的东西:
ViewStub vs = new ViewStub(this);
vs.setId(R.id.viewstub_id);
vs.setLayoutResource(R.layout.use_this_layout);
vs.setInflatedId(R.id.inflated_stub);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
vs.setLayoutParams(lp);
ConstraintLayout cl = findViewById(R.id.viewStubWrapper);
cl.addView(vs);
vs.inflate();
好像我根本不需要约束,我只需要使用LayoutParams.MATCH_PARENT
宽度和高度而不是 0。
推荐阅读
- vba - VBA、PowerPoint 冻结
- http - 从 http 获取特定字段到我们的 zabbix 服务器
- php - 如何在表单模型绑定 laravel 中调用第二个模型?
- protractor - Allure JS protractor-cucumber-framework cucumberOpts - 不止一个格式化程序
- swift - Swift - 在初始化程序中调用函数并在外部定义它
- angular - 阻止用户或管理员使用 rest api 的最佳实践
- postgresql - java.lang.ClassCastException:java.lang.Integer 不能转换为 java.math.BigDecimal
- c++ - 对几乎相同的代码执行不同的向量求和
- r - 删除多列的部分列名
- java - 在Java中将大写字母排在小写字母之前