为什么 EditText 只接受 Theme?
Why EditText only accepts Theme?
我试图将 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"
是的,EditText 会出现这种行为。我们需要使用 android:theme
属性.
来设置样式
当使用 @style
时,EditText 不使用我们设置的值(因此样式 似乎 被忽略)。这是因为 EditText 创建了一些未设置样式的 children 视图。请参阅下面我的详细解释。
详细解释及原因
1)首先,尝试的选项的含义以及它们的作用:
style
:(注意:没有前缀 android:
):这为组件本身设置样式 only 并执行 not 改变它底层的样式 children views/layouts.
android:theme
: 这基本上适用于自身的样式 和 将样式应用于它的 children views/layouts.
android:textAppearance
:这一个的行为就像 @style
的样式。
2) EditText
功能
正如我们所想象的那样:EditText 不仅仅是一个简单的视图。它有一个可绘制的背景并处理交互等。它只需要一些额外的视图(和逻辑)来使这个功能起作用。
对于 EditText
的功能,它 添加了 一些子视图作为 children 以便能够完成我们对它的期望。
3) 回到主题
EditText
为实现其功能而添加的子视图的样式与其他视图的样式相同。这意味着 child 视图仅在我们使用 android:theme
属性 时继承样式。因为这 属性 导致它也为 children 视图设置样式。
并且,如果我们在 edittext 上使用 @style
,children 将不会 获得此样式。
4) 为什么(仅)EditText 会发生这种情况?
嗯,不是真的 只有 ... EditText
的基本视图是 TextView
,但 TextView
不是'不提供 EditText
需要的功能。所以 EditText
本身添加了额外的功能。
例如 A Button
也有 TextView
作为基础。但是这个 class 有足够的视图以及它从基础 class 获得的文本和背景,因此 Button
不需要添加额外的视图来实现它的功能。因此,为此,使用 @style
是有效的,因为它不会创建 children 视图来设置样式。
说到这里,再补充一句:
事实上,在源代码中 TextView
实际上包含了编辑逻辑,但在 Button
的情况下它根本不执行那部分代码。 (按钮不需要 Editting
功能,因此不会被执行)
我试图将 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"
是的,EditText 会出现这种行为。我们需要使用 android:theme
属性.
当使用 @style
时,EditText 不使用我们设置的值(因此样式 似乎 被忽略)。这是因为 EditText 创建了一些未设置样式的 children 视图。请参阅下面我的详细解释。
详细解释及原因
1)首先,尝试的选项的含义以及它们的作用:
style
:(注意:没有前缀android:
):这为组件本身设置样式 only 并执行 not 改变它底层的样式 children views/layouts.android:theme
: 这基本上适用于自身的样式 和 将样式应用于它的 children views/layouts.android:textAppearance
:这一个的行为就像@style
的样式。
2) EditText
功能
正如我们所想象的那样:EditText 不仅仅是一个简单的视图。它有一个可绘制的背景并处理交互等。它只需要一些额外的视图(和逻辑)来使这个功能起作用。
对于 EditText
的功能,它 添加了 一些子视图作为 children 以便能够完成我们对它的期望。
3) 回到主题
EditText
为实现其功能而添加的子视图的样式与其他视图的样式相同。这意味着 child 视图仅在我们使用 android:theme
属性 时继承样式。因为这 属性 导致它也为 children 视图设置样式。
并且,如果我们在 edittext 上使用 @style
,children 将不会 获得此样式。
4) 为什么(仅)EditText 会发生这种情况?
嗯,不是真的 只有 ... EditText
的基本视图是 TextView
,但 TextView
不是'不提供 EditText
需要的功能。所以 EditText
本身添加了额外的功能。
A Button
也有 TextView
作为基础。但是这个 class 有足够的视图以及它从基础 class 获得的文本和背景,因此 Button
不需要添加额外的视图来实现它的功能。因此,为此,使用 @style
是有效的,因为它不会创建 children 视图来设置样式。
说到这里,再补充一句:
事实上,在源代码中 TextView
实际上包含了编辑逻辑,但在 Button
的情况下它根本不执行那部分代码。 (按钮不需要 Editting
功能,因此不会被执行)