首页 > 解决方案 > 如何为自定义 TextInputLayout 设置默认样式

问题描述

我想用默认样式创建 au 自定义 TextInputLayout。但是没有应用样式。

class AutoCompleteTextInputLayout @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = R.style.AppTheme_TextInputLayout_DropdownMenu
): TextInputLayout(context, attrs) {

    init {
        context.inflater.inflate(R.layout.auto_complete_text_input_layout, this,true) 
    }

}
<style name="AppTheme.TextInputLayout.DropdownMenu" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu">
    <item name="endIconMode">dropdown_menu</item>
</style>

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <AutoCompleteTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</merge>

我不希望默认情况下将这种样式应用于所有 TextInputLayout 因为我已经有一个如下所示:

    <style name="AppTheme" parent="Theme.MaterialComponents.Light">
        <item name="textInputStyle">@style/AppTheme.TextInputLayout</item>>
    </style>

在此先感谢您的帮助

标签: androidkotlinandroid-themematerial-components-androidandroid-textinputlayout

解决方案


您不能使用构造函数,R.style.AppTheme_TextInputLayout_DropdownMenu因为 的第三个参数TextInputLayout 不是样式,而是属性主题 as R.attr.textInputStyle

你可以使用类似的东西:

public class AutoCompleteTextInputLayout @JvmOverloads constructor(
        context: Context, 
        attrs: AttributeSet? = null, 
        defStyleAttr: Int = R.attr.textInputStyle
) : TextInputLayout(ContextThemeWrapper(context, R.style.Custom_Theme),
                    attrs, defStyleAttr) { ...  }

带有自定义主题:

<style name="Custom.Theme" parent="">
   <item name="textInputStyle">@style/AppTheme.TextInputLayout.DropdownMenu</item>
</style>

通过这种方式,您将创建一个具有指定主题 ( Custom.Theme) 的新上下文包装器。此主题仅由自定义小部件使用AutoCompleteTextInputLayout
这意味着其他TextInputLayout的继续使用默认样式(由 中的属性定义textInputStyleAppTheme

例子:

<AutoCompleteTextInputLayout>

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

</AutoCompleteTextInputLayout>

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

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

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

在此处输入图像描述


推荐阅读