如何实现登录ViewStub覆盖Welcome Activity并让底层控件变暗
问题原因及修复方案
按钮无变暗效果的核心原因
你在activity_welcome.xml中把ViewStub写在了三个按钮的前面,ConstraintLayout的渲染规则是按XML书写顺序从下到上叠加视图,后声明的视图层级更高,所以你inflate出来的半透明遮罩实际是在按钮下方,自然无法遮挡按钮产生变暗效果。全屏覆盖的尺寸设置问题
不需要设置为wrap_content,你当前给ViewStub写死了360dp*620dp的固定尺寸,本身就不是全屏规格,要实现全屏覆盖直接把ViewStub的宽高都设置为match_parent即可。
具体修改步骤
- 调整XML中ViewStub的位置,把它移到所有按钮的后面,也就是ConstraintLayout闭合标签的前一行,保证它的层级是最高的。
- 修改ViewStub的宽高属性:
<ViewStub android:id="@+id/loginStub" android:layout_width="match_parent" android:layout_height="match_parent" android:layout="@layout/viewstub_login" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
- 补充优化:可以把inflate返回的View全局存储,后续需要关闭登录遮罩时直接调用
setVisibility(View.GONE)即可,不需要重复inflate。
方案选型说明
你的需求用ViewStub完全可以实现,优势是默认不加载布局,只有点击登录时才渲染,不会影响欢迎页的启动性能。如果后续登录交互需要支持弹出动画、返回键一键关闭、边缘点击关闭等逻辑,也可以换成DialogFragment实现,不需要占用主布局的层级。
内容的提问来源于stack exchange,提问作者Zachary Smouse
相关产品推荐
相关产品推荐

