我试图将style
应用于EditText
来更改其colorAccent
,我试图设置其style
和android:textAppearance
,但是完全忽略了我的新设置。使它工作的唯一方法是设置其android:theme
。
我做错什么了吗?或者这是预期的行为?为什么?
我的风格:
<style name="bright_color_cursor" parent="AppTheme">
<item name="colorAccent">@color/primaryBrightColor</item>
<item name="android:textColorHighlight">@color/primaryBrightColor</item>
</style>
我的EditText
:
<EditText
android:id="@+id/edit_text"
android:theme="@style/bright_color_cursor"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="@android:color/transparent"
android:ems="10"
android:hint="@string/hello"
android:inputType="textCapWords"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/name_edit_text"
app:layout_constraintTop_toBottomOf="@+id/divider" />
将android:theme
更改为以下任何设置均无效:
style="@style/bright_color_cursor"
或
android:textAppearance="@style/bright_color_cursor"
答案 0 :(得分:1)
是的,使用EditText是可以预期的。我们需要使用android:theme
属性设置样式。
使用@style
时,EditText不使用我们设置的值(因此,样式似乎被忽略)。这是因为EditText会创建一些未设置样式的子视图。请参阅下面的详细说明。
详细说明和原因
1)首先,尝试了这些选项的含义以及它们的作用:
style
:(注意:不以android:
为前缀):这将为组件本身设置样式 only ,并且不更改底层儿童视图/布局的样式。android:theme
:这基本上适用于样式本身,并将样式应用于其孩子视图/布局android:textAppearance
:此样式的行为类似于@style
。 2)EditText
功能
我们可以想象:EditText不仅仅是一个简单的视图。它具有背景可绘制并处理交互等。它仅需要一些其他视图(和逻辑)即可使用此功能。
对于EditText
的功能,它会作为子级添加作为子级,以完成我们期望的操作。
3)返回主题
EditText
添加以执行其功能的子视图的样式与其他视图的样式相同。这意味着当我们使用android:theme
属性时,子视图仅继承样式。因为此属性也使它也可以样式化子视图。
而且,如果我们在编辑文本上使用@style
,则子级不会获得这种样式。
4)为什么仅对于EditText会发生这种情况?
嗯,不是真的 ... EditText
的基本视图是TextView
,但是TextView
并没有提供EditText
的需求。因此EditText
本身添加了其他功能。
例如,一个Button
也以TextView
为基础。但是该类具有足够的视图以及从基类获得的文本和背景,因此Button
无需为其功能添加其他视图。因此,为此,使用@style
可以工作,因为它不会创建任何样式的子视图。
这么说,这里有一个小小的注释:
实际上,在源代码中,TextView
实际上包含编辑逻辑,但是在Button
的情况下,它根本不执行那部分代码。 (按钮不需要Editting
功能,因此不会被执行)