为什么EditText只接受主题?

时间:2018-09-06 21:52:01

标签: android android-edittext android-theme android-styles

我试图将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"

1 个答案:

答案 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功能,因此不会被执行)