我想使用默认样式创建所有自定义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>
预先感谢您的帮助
答案 0 :(得分:0)
您不能将构造函数与R.style.AppTheme_TextInputLayout_DropdownMenu
一起使用,因为TextInputLayout
的 3rd 参数不是样式,而是属性主题为 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
继续使用默认样式(由textInputStyle
中的属性AppTheme
定义)。
示例:
<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>