You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Material 1.4.0时自定义View内部TextView夜间模式不切换文字颜色

问题原因
  1. Context使用错误:你初始化自定义View时传入的getActivity().getBaseContext()是应用全局的上下文,它不持有当前Activity的主题配置,也不会跟随Activity的深浅模式切换更新主题属性值。而XML中直接添加的View默认使用所属Activity的Context加载,自带最新的主题配置,因此Material样式中引用的主题属性色值(比如?attr/colorOnSurface)可以随深浅模式自动更新。
  2. 构造参数传入错误:你尝试传入R.id.AppTheme的用法不符合规范,自定义View构造函数的第三个参数是主题属性引用,不是主题/样式的资源ID,传值错误无法让自定义View正确加载指定主题。
规范解决方案
  1. 使用正确的Context初始化自定义View:直接传入Fragment关联的Activity实例作为Context,不要使用BaseContext或Application Context,示例代码:
new MyView(requireActivity());
  1. 自定义View内部创建子View时,使用View自身的Context:不要在自定义View内部硬编码使用全局上下文创建子View,保证子View继承到正确的主题配置:
// MyView内部创建TextView示例
val textView = TextView(context) // 直接用自定义View持有的context
textView.setTextAppearance(R.style.TextAppearance_MaterialComponents_Body1)
  1. 如果需要自定义View默认样式,按规范配置构造参数:
    • 首先在attrs.xml中定义自定义View的主题属性
    • 构造函数中正确传入defStyleAttr和默认defStyleRes,保证样式可正常继承主题属性
  2. 如果你在Activity中配置了android:configChanges="uiMode"自行处理深浅模式切换:需要在onConfigurationChanged回调中手动重新应用View样式,或者触发View刷新主题属性。

你之前用自定义color资源的方案属于绕路实现,用上述规范方案后不需要单独维护深浅模式下的颜色资源,直接使用MaterialComponents提供的样式即可正常跟随系统切换颜色。

内容的提问来源于stack exchange,提问作者lostintranslation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:24:11