android ViewStub使用注意事项
<ViewStub
android:id="@+id/view_stub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inflatedId="@+id/stub_root"
android:layout="@layout/viewstub_test" />
- id是为了第一次findViewById找到这个ViewStub对象,一旦inflate或设置View.VISIBLE,这个id就没用了,因此不要在其他地方使用这个id
- inflatedId则是指定实际布局的根布局的id,注意这个是可有可无的,一旦声明了,即使实际布局的根布局有指定id,也会被这个覆盖
- 还有另外一种情况就是当有约束作用在ViewStub上,我们就需要使用这个inflatedId,而不是id
- layout就是要替换ViewStub的实际上的布局
注意事项
- 在实际使用过程中,发现有如下注意事项:
- 注意实际布局的根布局不能是merge
- viewstub只能inflate一次,再次调用会抛异常
- ViewStub的layout_width和layout_height优先级最高,会覆盖实际的布局
- ViewStub的padding不会生效,而实际根布局的会生效
- ViewStub的背景不会生效,而实际根布局的会生效
- 实际根布局里的最大宽高设置不会生效
- 实际根布局里的padding可以生效
- ViewStub的margin会生效,而实际根布局里的margin属性不会生效
- 只有ViewStub可以使用约束,而实际根布局里的约束无效
- viewstub一旦被inflated就会被实际的布局替换,被inflated再次调用findViewById会返回为null,如果inflatedId和id一样的话需要注意不能对findViewById的view进行缓存
预览
- 由于ViewStub类似占位,因此在xml中是无法预览的,虽然可以使用tools,比如tools:layout,但你会发现还是什么都没显示,此时只需要再加上 tools:visibility=“visible” 即可,示例如下
<ViewStub
android:id="@+id/view_stub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout="@layout/viewstub_test"
tools:visibility="visible" />
- 这样就可以预览到tools:layout所指向的布局了