在设计库源代码中,我们可以找到以下行:
<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?
答案 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)
为简化起见,您有一个自定义视图,其中包含一组属性。为了提供值,从底部(视图)到顶部(应用程序)有三种不同的方式
style="@style/MyStyle"
将它们分配给该视图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>