如何解决AlertDialog内TextInputLayout设置OutlinedBox样式不生效问题
问题根源
AlertDialog的内置主题优先级高于控件动态设置的style,直接用Activity/baseContext创建控件时,样式会被父级AlertDialog的主题覆盖,所以之前的两种方案都不生效。
可行解决思路
方案1:使用ContextThemeWrapper包裹控件创建上下文(改动最小)
不需要修改全局配置,动态给TextInputLayout套上带OutlinedBox样式的上下文即可避开对话框主题覆盖:
// 先创建带OutlinedBox样式的专用上下文 val textInputContext = ContextThemeWrapper(this, R.style.Widget_MaterialComponents_TextInputLayout_OutlinedBox) val editText = AlertDialogEditText(textInputContext) // 可选:显式指定box模式,避免部分机型样式不生效 editText.boxBackgroundMode = TextInputLayout.BOX_BACKGROUND_OUTLINE editText.hint = "请输入内容" val textInputEditText = TextInputEditText(editText.context) editText.addView(textInputEditText) val alertDialog = AlertDialog.Builder(this) .setTitle("Crear aula") .setView(editText) .create() alertDialog.show()
方案2:自定义AlertDialog主题,全局指定内部TextInputLayout样式
在res/values/styles.xml中新增自定义对话框主题,指定内部TextInputLayout的默认样式:
<style name="CustomAlertDialogTheme" parent="Theme.MaterialComponents.Light.Dialog.Alert"> <item name="textInputStyle">@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox</item> </style>
创建AlertDialog时传入该主题即可,无需单独给TextInputLayout设置样式:
val alertDialog = AlertDialog.Builder(this, R.style.CustomAlertDialogTheme) .setTitle("Crear aula") val editText = AlertDialogEditText(this) val textInputEditText = TextInputEditText(this) editText.addView(textInputEditText) alertDialog.setView(editText) alertDialog.create().show()
方案3:替换为MaterialAlertDialogBuilder
如果项目已接入MaterialComponents组件库,直接用MaterialAlertDialogBuilder替代原生AlertDialog.Builder,对Material样式控件的兼容性更好,样式默认即可生效:
// 构造TextInputLayout时直接传入样式参数 val editText = TextInputLayout(this, null, 0, R.style.Widget_MaterialComponents_TextInputLayout_OutlinedBox) val textInputEditText = TextInputEditText(this) editText.addView(textInputEditText) MaterialAlertDialogBuilder(this) .setTitle("Crear aula") .setView(editText) .show()
注意事项
- 不要用
baseContext创建UI控件,baseContext没有携带当前Activity的主题配置,容易出现样式异常 - 控件样式默认在构造阶段读取,构造完成后再调用设置style的方法大部分场景不生效,建议在构造时就传入样式参数或者用ContextThemeWrapper包裹上下文
内容的提问来源于stack exchange,提问作者Nekidev
相关产品推荐
相关产品推荐

