使用ViewBinding后setTheme()失效无法切换Activity主题求助
问题根因
- 核心是ViewBinding的初始化时机错误:绝大多数出现该问题的开发者,都在
setTheme()执行前就完成了ViewBinding的初始化,比如在onCreate()方法最开头就执行了MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());。此时LayoutInflater使用的是Activity默认的初始主题,inflate生成的根View已经应用了初始主题的样式属性,后续再调用setTheme()也不会反向更新已经创建完成的View实例。 - 原先直接传入布局ID调用
setContentView(R.layout.my_layout)时,布局的inflate动作是setContentView()内部在setTheme()执行完成后才触发的,此时LayoutInflater使用的是已经切换完成的目标主题,所以样式能正常生效。
修复方案
调整代码执行顺序,严格保证setTheme()执行完成后,再初始化ViewBinding:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 第一步:先设置目标主题 setTheme(getAppTheme()); // 第二步:主题设置完成后再 inflate 生成ViewBinding实例 MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // 后续其他业务逻辑 }
- 如果是运行时动态切换主题,切换后调用
recreate()重建当前Activity即可,重建流程会优先应用新主题再初始化ViewBinding,样式就能正常生效。 - 不要在
super.onCreate()执行前调用setTheme(),部分Android系统版本会出现上下文不匹配的异常。
内容的提问来源于stack exchange,提问作者A.Hosein
相关产品推荐
相关产品推荐

