Android Studio中Kotlin修改按钮样式失效并报资源找不到错误求助
问题解决:动态切换Material按钮样式时出现
Resources$NotFoundException 错误原因
setBackgroundResource()方法仅适用于加载Drawable类型资源(如shape、png、selector等),你传入的是Style资源ID,系统无法将Style识别为Drawable,因此抛出资源未找到异常。
解决方案
前提确认
确保布局中的按钮是com.google.android.material.button.MaterialButton(而非原生Button),否则MaterialComponents的样式无法正常生效。
方法一:使用MaterialButton专属API切换样式(推荐)
MaterialButton提供了setStyle()方法用于动态切换按钮样式,要求Material Components Library版本≥1.6.0或Android API≥31:
修改Fragment中的代码:
binding.btnWon.setOnClickListener { binding.btnFore.setStyle(R.style.borderlessButton, true) binding.btnWon.setStyle(R.style.borderButton, true) } binding.btnFore.setOnClickListener { binding.btnWon.setStyle(R.style.borderlessButton, true) binding.btnFore.setStyle(R.style.borderButton, true) }
方法二:兼容低版本的替代方案
如果需要兼容更低版本,可以通过修改按钮的背景着色、边框属性来模拟样式切换:
- 在
drawable目录下创建按钮边框的shape文件(命名为border_button.xml):
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="?attr/colorPrimary"/> <corners android:radius="4dp"/> </shape>
- 在Kotlin代码中切换背景和文本样式:
binding.btnWon.setOnClickListener { // 设置无框样式 binding.btnFore.background = null binding.btnFore.setTextAppearance(R.style.borderlessButton) // 设置有框样式 binding.btnWon.background = ContextCompat.getDrawable(requireContext(), R.drawable.border_button) binding.btnWon.setTextAppearance(R.style.borderButton) } binding.btnFore.setOnClickListener { binding.btnWon.background = null binding.btnWon.setTextAppearance(R.style.borderlessButton) binding.btnFore.background = ContextCompat.getDrawable(requireContext(), R.drawable.border_button) binding.btnFore.setTextAppearance(R.style.borderButton) }
额外注意事项
- 确保
themes.xml中的样式继承正确,borderButton和borderlessButton的父样式要对应MaterialButton的标准样式; - 若使用方法一,需确认项目依赖的Material Components Library版本足够高(在
build.gradle中检查implementation 'com.google.android.material:material:1.6.0+')。
内容的提问来源于stack exchange,提问作者장인수
相关产品推荐
相关产品推荐

