样式自定义TextInputLayout归因于主题

时间:2016-02-04 10:14:16

标签: android android-theme android-support-design android-custom-attributes

在设计库源代码中,我们可以找到以下行:

<declare-styleable name="TextInputLayout">
    <attr format="reference" name="hintTextAppearance"/>
    <attr name="android:hint"/>
    <attr format="boolean" name="errorEnabled"/>
    <attr format="reference" name="errorTextAppearance"/>
    <attr format="boolean" name="counterEnabled"/>
    <attr format="integer" name="counterMaxLength"/>
    <attr format="reference" name="counterTextAppearance"/>
    <attr format="reference" name="counterOverflowTextAppearance"/>
    <attr name="android:textColorHint"/>
    <attr format="boolean" name="hintAnimationEnabled"/>
</declare-styleable>

我想通过errorTextAppearance attribut

更改错误文本的颜色

我知道如何在TextInputLayout xml声明中通过app:{atribut-name}自定义它,但是如何从我的主题定义中自定义其中一个attribut?

2 个答案:

答案 0 :(得分:0)

styles.xml:

<android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/Theme.AppName.TextInputLayout">

                ...
            </android.support.design.widget.TextInputLayout>
布局中的

Widget.Design.TextInputLayout

您还可以在Theme.AppName.TextInputLayout

中添加.val()中的其他项目

答案 1 :(得分:0)

为简化起见,您有一个自定义视图,其中包含一组属性。为了提供值,从底部(视图)到顶部(应用程序)有三种不同的方式

  1. 通过属性或以编程方式为视图提供值
  2. 创建不同的样式,然后使用style="@style/MyStyle"将它们分配给该视图
  3. 创建一个属性,并将其分配给自定义视图的构造函数的defStyleAttr参数。并在主题和Voila中为该属性分配样式!

对于前两个,它很简单。让我们专注于最后一种方法。要实现这一目标,需要四个步骤

第1步

创建一个属性(通常在res/values/attrs.xml文件中

<resources>
    <attr name="myCustomViewAttr" format="reference" />

    <!-- Below are your set of attributes in declare styleable -->
    <declare-styleable name="TextInputLayout">
       <attr format="reference" name="hintTextAppearance"/>
       <attr name="android:hint"/>
       <attr format="boolean" name="errorEnabled"/>
       <attr format="reference" name="errorTextAppearance"/>
       <attr format="boolean" name="counterEnabled"/>
       <attr format="integer" name="counterMaxLength"/>
       <attr format="reference" name="counterTextAppearance"/>
       <attr format="reference" name="counterOverflowTextAppearance"/>
       <attr name="android:textColorHint"/>
       <attr format="boolean" name="hintAnimationEnabled"/>
    </declare-styleable>
</resources>

第2步

在您的自定义视图中使用这个新创建的属性。

假设您的自定义视图的类名称为MyCustomView。您班级的构造函数看起来像这样

class MyCustomView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = R.attr.myCustomViewAttr
) : TextInputLayout(context, attrs, defStyleAttr)

如果布局中的属性未提供任何内容,这将强制MyCustomView使用myCustomViewAttr中的属性。

第3步

创建一种样式,这是大多数人最容易使用的样式

<style name="Widget.MyApp.MyCustomView" parent="">
   <!-- Assuming you have already defined TextAppearance.MyApp.ErrorText as you required -->
   <item name="errorTextAppearance">@style/TextAppearance.MyApp.ErrorText</item>
</style>

如果您要为errorTextAppearance分配一些其他属性,然后

<style name="Widget.MyApp.MyCustomView" parent="">
   <!-- Assuming you have already defined TextAppearance.MyApp.ErrorText as you required -->
   <item name="errorTextAppearance">?attr/myAnotherDefinedAttribute</item>
</style>

第4步

最后一步,将样式分配给属性

<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
   <item name="myCustomViewAttr">@style/Widget.MyApp.MyCustomView</style>
</style>

如果您的文字外观来自其他属性,则可以直接分配该属性

<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
   <item name="myCustomViewAttr">?attr/textAppearanceForError</style>
</style>