按谷歌文档自定义Cast按钮样式时遇mediaRouteTheme未找到错误,求排查
mediaRouteTheme属性找不到的问题 你遇到的这个mediaRouteTheme属性找不到的错误,大概率是因为没正确引入Media Router相关依赖,或者主题继承的姿势不对,我给你拆解下问题和解决办法:
先复盘你的问题场景
你按照文档写的样式代码:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">#7788FF</item> <item name="colorPrimaryDark">#7700FF</item> <item name="mediaRouteTheme">@style/CustomMediaRouterTheme</item> </style> <style name="CustomMediaRouterTheme" parent="Theme.MediaRouter"> <item name="mediaRouteButtonStyle">@style/CustomMediaRouteButtonStyle</item> </style> <style name="CustomMediaRouteButtonStyle" parent="Widget.MediaRouter.Light.MediaRouteButton"> <item name="buttonTint">#CCCC00</item> </style>
编译时抛出错误:Error:error: style attribute 'attr/mediaRouteTheme (aka com.*:attr/mediaRouteTheme)' not found
核心原因
mediaRouteTheme这个属性是Media Router库提供的,不是Android框架自带的。如果你的项目里没添加对应的依赖,IDE自然找不到这个属性。另外,AndroidX和旧Support库的主题命名也有差异,搞错了也会出问题。
具体解决步骤
1. 先确认添加了Media Router依赖
打开你模块级别的build.gradle(不是项目根目录的那个),根据你的项目使用的是AndroidX还是旧Support库,添加对应依赖:
- 如果你用AndroidX:
implementation "androidx.mediarouter:mediarouter:1.3.0"
- 如果你用旧Support库:
implementation "com.android.support:mediarouter-v7:28.0.0"
版本号可以换成最新稳定版,但要保证和你的AppCompat/Material Components版本匹配,避免版本冲突。
2. 调整主题继承关系
如果你用的是AndroidX,Theme.MediaRouter已经被替换成Theme.MaterialComponents.Light.MediaRouter,所以你的CustomMediaRouterTheme要改成:
<style name="CustomMediaRouterTheme" parent="Theme.MaterialComponents.Light.MediaRouter"> <item name="mediaRouteButtonStyle">@style/CustomMediaRouteButtonStyle</item> </style>
如果是旧Support库,保持Theme.MediaRouter即可,但必须确保依赖已经添加成功。
3. 更简单的替代方案(绕开mediaRouteTheme)
其实不用嵌套mediaRouteTheme,直接在AppTheme里设置mediaRouteButtonStyle也行,这样更不容易出错:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">#7788FF</item> <item name="colorPrimaryDark">#7700FF</item> <!-- 直接指定按钮样式 --> <item name="mediaRouteButtonStyle">@style/CustomMediaRouteButtonStyle</item> </style> <style name="CustomMediaRouteButtonStyle" parent="Widget.MaterialComponents.MediaRouteButton"> <item name="tint">#CCCC00</item> </style>
注意这里父按钮样式要对应你的主题,AndroidX用Widget.MaterialComponents.MediaRouteButton,旧Support库用Widget.MediaRouter.Light.MediaRouteButton。
4. 同步并重新编译
添加依赖/修改代码后,点击Android Studio右上角的「Sync Now」按钮,等Gradle同步完成后再重新编译项目,这个错误应该就消失了。
内容的提问来源于stack exchange,提问作者N Jacobs

