为啥我不能通过 android:theme 更改hintTextAppearance?

Posted

技术标签:

【中文标题】为啥我不能通过 android:theme 更改hintTextAppearance?【英文标题】:why can't I change hintTextAppearance via android:theme?为什么我不能通过 android:theme 更改hintTextAppearance? 【发布时间】:2020-06-12 06:04:03 【问题描述】:

大家好,我是 android 主题和样式的新手。根据官方文件

样式是指定单个 View 外观的属性集合。样式可以指定诸如字体颜色、字体大小、背景颜色等属性。主题是一种应用于整个应用、活动或视图层次结构的样式,而不仅仅是单个视图

但我无法通过 android:theme 属性更改某些属性,但我可以通过 style

更改

我这里有这个样式文件:

<style name="Style.InputLayout" parent="Widget.Design.TextInputLayout">
    <item name="errorTextAppearance">@style/ErrorTextAppearance</item>
    <item name="hintTextAppearance">@style/HintTextAppearance</item>
    <item name="errorEnabled">true</item>
</style>
<style name="HintTextAppearance" parent="TextAppearance.Design.Hint">
    <!-- Inactive and Active label color-->
    <item name="android:textColor">?attr/colorShadow</item>
</style>

<style name="ErrorTextAppearance" parent="TextAppearance.Design.Error">
    <!-- Error text color-->
    <item name="android:textColor">?attr/colorError</item>
</style>

我有一个 TextInputLayout:

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/tfUsername"
        android:layout_
        android:layout_
        style="@style/Style.InputLayout"
        android:hint="Username">
        <com.google.android.material.textfield.TextInputEditText
            android:layout_
            android:layout_
            android:theme="@style/Theme.EditText"/>

    </com.google.android.material.textfield.TextInputLayout>

这按我的预期工作。但是当我在 TextInputLayout 中将 style 属性更改为 android:theme 时,如下所示:

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/tfUsername"
    android:layout_
    android:layout_
    android:theme="@style/Style.InputLayout"
    android:hint="Username">
    <com.google.android.material.textfield.TextInputEditText
        android:layout_
        android:layout_
        android:theme="@style/Theme.EditText"/>

</com.google.android.material.textfield.TextInputLayout>

它不起作用。这是为什么呢?

【问题讨论】:

【参考方案1】:

它不起作用。这是为什么呢?

<com.google.android.material.textfield.TextInputLayout
    android:theme="@style/Style.InputLayout"

它不起作用,因为它错误。 你可以使用类似的东西:

<com.google.android.material.textfield.TextInputLayout
        android:theme="@style/Style.MyColor"
        ...>

与:

  <style name="MyColor" parent="">
    <item name="colorPrimary">@color/.....</item>
  </style>

通过这种方式,您可以修改该视图和任何子视图的主题属性,这对于覆盖界面特定部分的主题调色板很有用。

您可以在official doc找到更多信息。

【讨论】:

好的,所以主题属性与样式属性不同? @ahmetsarias 是的,它们是不同的【参考方案2】:

这样使用:

在样式上使用此代码

<style name="MyColor" parent="">
<item name="android:colorControlActivated">@color/colorTextGray</item>
    <itemname="android:colorControlHighlight">@color/colorTextGray</item>
    <item name="android:colorControlNormal">@color/colorTextGray</item>
</style>



                <com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/layoutTextInput"
                    android:layout_
                    android:layout_
                    android:theme="@style/MyColor"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toStartOf="@+id/guideline131"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintStart_toStartOf="@+id/guideline121"
                    app:layout_constraintTop_toBottomOf="@+id/ed_phone"
                    app:layout_constraintVertical_bias="0.0"
                    app:passwordToggleDrawable="@drawable/show_password_selector"
                    app:passwordToggleEnabled="true"
                    app:passwordToggleTint="@color/colorWhite">

                    <androidx.appcompat.widget.AppCompatEditText
                        android:id="@+id/ed_password_mobile"
                        android:layout_
                        android:layout_
                        android:layout_marginTop="30dp"
                        android:inputType="textPassword"
                        android:textColor="@color/colorWhite"

                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toStartOf="@+id/guideline131"
                        app:layout_constraintLeft_toLeftOf="parent"
                        app:layout_constraintRight_toRightOf="parent"
                        app:layout_constraintStart_toStartOf="@+id/guideline121"
                        app:layout_constraintTop_toBottomOf="@+id/ed_phone"
                        app:layout_constraintVertical_bias="0.0" />
                </com.google.android.material.textfield.TextInputLayout>

【讨论】:

以上是关于为啥我不能通过 android:theme 更改hintTextAppearance?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能通过更改“高度”值来调整浏览器上的 Onlyoffice 高度

Android怎么动态更改actionbar的背景颜色

为啥我不能通过取消选中 CodeIgniter 中的复选框来更改数据库中的数据?

在 ORM 设计器中,为啥服务器对象不能通过新的更改正确刷新?

为啥我的 Java 方法不能更改传递的变量? [复制]

android Theme.Holo.Dialog 将蓝线变为橙色