哪些Compat Views可直接正确使用?AppCompatTextView与LinearLayoutCompat疑问
一、先搞懂AppCompatTextView的自动替换逻辑
你提到的这个点完全正确:
当布局中使用EditText且顶层Activity/Dialog由appcompat提供时,该类会自动被使用,仅在编写自定义视图时需手动调用。
这是因为AppCompat库的LayoutInflater会悄悄帮我们做控件替换——它会把布局里的部分标准Android控件,自动替换成对应的AppCompat版本。比如你写了<EditText>,系统会自动换成AppCompatEditText(它继承自AppCompatTextView),所以日常布局里根本不用手动写AppCompatTextView或者AppCompatEditText,系统会帮我们搞定适配。
二、LinearLayoutCompat为啥没这待遇?要不要直接用它?
AppCompat的自动替换列表里没有包含LinearLayout,所以系统不会把你写的<LinearLayout>自动换成LinearLayoutCompat。那要不要直接用LinearLayoutCompat?我的建议是:完全可以,而且非常推荐。
因为LinearLayoutCompat在原生LinearLayout的基础上,加了不少实用的增强特性——比如支持divider(分割线)、showDividers(控制分割线显示位置)、dividerPadding(分割线内边距)这些属性,而原生LinearLayout在Android 5.0之前的系统上是不支持这些的。而且它完全兼容原生LinearLayout的所有功能,替换成本极低,用了之后能让你的布局在不同系统版本上表现更一致。
三、哪些Compat Views可以直接放心用?
下面这些Compat控件都可以直接在布局里写类名使用,能带来跨版本的样式和功能兼容:
LinearLayoutCompat:带分割线增强特性,完美兼容旧系统RelativeLayoutCompat:优化了layout_alignStart/layout_alignEnd这类属性的跨版本表现,还在使用RelativeLayout的话优先选它FrameLayoutCompat:支持在旧系统上使用foreground属性(比如点击遮罩层)AppCompatButton:自动适配Material设计的按钮样式,在旧系统上也能显示theme里配置的圆角、填充、颜色AppCompatEditText:自带hint动画、输入框样式的跨版本兼容,也可以直接写<EditText>让系统自动替换,效果一致AppCompatCheckBox/AppCompatRadioButton:解决旧系统上Material风格选中状态drawable显示异常的问题AppCompatImageView:支持srcCompat属性,能在旧系统上正常显示VectorDrawable矢量图AppCompatSpinner:优化了下拉菜单的样式,避免旧系统上的UI错乱AppCompatSeekBar:让滑动条的thumb(滑块)和track(轨道)样式在各版本系统上统一
简单总结:对于这些Compat控件,直接写类名使用绝对没问题,尤其是你的app需要兼容Android 5.0以下版本时,能帮你省掉很多适配的麻烦。而那些会被自动替换的控件(比如EditText、TextView),你既可以写原生类名让系统自动替换,也可以直接写Compat类名,效果是一样的,后者会更明确。
内容的提问来源于stack exchange,提问作者Alessandro Scarozza

