为什么 EditText 只接受 Theme?

Why EditText only accepts Theme?

我试图将 style 应用到 EditText 以更改它的 colorAccent,我试图设置它的 styleandroid: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 功能,因此不会被执行)