为何需定义layout_height与layout_width?TextView加requestFocus的属性疑问
关于TextView添加requestFocus后必须指定宽高的原因解释
嗨,这个问题得从Android布局系统的底层逻辑说起,我给你掰扯清楚:
首先得纠正一个误区:所有Android View(包括TextView)本质上都要求指定layout_width和layout_height,你觉得不加requestFocus时不用写,其实是编辑器或者系统偷偷帮你补了默认值而已。比如Android Studio的可视化编辑器,当你拖入控件时会自动填上wrap_content或者match_parent;就算你手动写XML时忘了,编译阶段系统也会给这两个属性设置默认值,所以能正常运行。
那为什么加了requestFocus就必须手动写呢?
- 当你给TextView加上焦点相关属性后,这个控件就变成了可获取焦点的交互控件,Android的焦点系统在处理这类控件时,会严格校验布局参数——因为焦点的视觉反馈(比如那个焦点框)需要明确知道控件的边界范围,要是宽高不确定,焦点框根本没法正确绘制,甚至焦点获取逻辑都会出问题。
- 另外,XML解析器在遇到焦点属性时,会进入更严格的校验模式,不再允许依赖默认值,必须让开发者明确指定宽高,避免因为布局参数模糊导致的运行时异常。
给你看看你提供的这段未加requestFocus的代码(其实里面已经写了宽高啦):
<TextView android:id="@+id/txtRespiratory" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginStart="8dp" android:layout_marginTop="16dp" android:text="Respiratory Rate" android:textAppearance="@android:style/TextAppearance.Material.Large" app:layout_constraint... />
简单总结就是:焦点控件需要明确的布局边界来支撑其交互逻辑,所以系统强制要求你手动指定宽高,不能偷懒依赖默认值~
内容的提问来源于stack exchange,提问作者Roberto Gimenez
相关产品推荐
相关产品推荐

