android - 为什么 Cast MediaRouteButton 即使在 Holo.Light Action-Bar 上也总是白色的?

标签 android android-actionbar android-theme chromecast android-styles

我正在从一个自定义 MediaRouteButton 移动到操作栏内的一个,但它没有正确显示。定制时的按钮是白色的,这正是我想要的。但是,即使操作栏是“Holo.Light”样式,按钮在操作栏上仍然是白色的(几乎看不到)。该按钮应该是深色的。

按钮创建为 XML 菜单项:

<item
    android:id="@+id/menu_item_media_route"
    android:title="@string/menu_item_media_route"
    android:actionViewClass="android.support.v7.app.MediaRouteButton"
    android:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
    android:showAsAction="always" />

我的应用是“@style/AppTheme”风格:

<style name="AppTheme" parent="android:Theme.Holo.Light">
</style>

主题“@style/FullscreenActionbarTheme”我的 Activity :

<style name="FullscreenActionbarTheme" parent="android:Theme.Holo.Light">
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowBackground">@null</item>
    <item name="android:actionBarStyle">@style/FullscreenActionbar</item>
</style>

<style name="FullscreenActionbar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
</style>

我没有自定义“ic_media_route_(on|off).png”可绘制对象——我以前有但删除了它们。

我试过改变各种样式,虽然操作栏会变暗,但转换按钮始终是白色的。 (因为它应该在深色操作栏上而不是浅色操作栏上。)

按钮功能齐全,只是颜色不对。按下按钮时出现的“选择器”对话框样式为“Holo.Light”。

那么,为什么我的转换按钮在“Holo.Light”主题上显示为白色,就好像它是“Holo”(深色)主题一样?

最佳答案

取自:Link

Caution: When implementing an activity that provides a media router interface you must extend either ActionBarActivity or FragmentActivity from the Android Support Library, even if your android:minSdkVersion is API 11 or higher.

ActionBarActivity 已被 AppCompatActivity 取代,因此您应该改用它。

Support-V7 MediaRouteButton 依赖于此。查看 super 调用:

public MediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) {
    super(MediaRouterThemeHelper.createThemedContext(context), attrs, defStyleAttr);
    ....
    ....
}

MediaRouterThemeHelper.createThemedContext(Context):

public static Context createThemedContext(Context context) {
    boolean isLightTheme = isLightTheme(context);
    return new ContextThemeWrapper(context, isLightTheme ?
            R.style.Theme_MediaRouter_Light : R.style.Theme_MediaRouter);
}

isLightTheme 通过解析 R.attr.isLightTheme 设置 <<== 这是一个支持库属性。当您的父主题由框架提供时,它不会出现,例如 android:Theme.Holo.Light

private static boolean isLightTheme(Context context) {
    TypedValue value = new TypedValue();
    return context.getTheme().resolveAttribute(R.attr.isLightTheme, value, true)
            && value.data != 0;
}

因此,isLightThemefalse 并且您将获得 MediaRouteButton 的深色主题版本 ==> ... 始终为白色。

请注意,警告 语句暗示您的父主题必须是 AppCompat 主题 - AppCompatActivity(或 ActionBarActivity)无法使用android:Theme.*.

编辑:

这里发生了很多讨论:Link

人们可以通过聊天记录来阅读尝试过的方法。最后,媒体路由器支持库似乎需要一些工作才能投入生产。在这里阅读更多:MediaRouteActionProvider connection dialog theme .

关于android - 为什么 Cast MediaRouteButton 即使在 Holo.Light Action-Bar 上也总是白色的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28385494/

相关文章:

android - Google 登录在发布版本上失败

android - 当 subview 的内容更改时, ScrollView 不会调整大小

android - 将 CardView 高程重置为默认值(静止高程)

android - MediaRouteActionProvider 连接对话框主题

java - 为什么我不能比较这两个字符串?

java - 下载后动态更改背景图像

android - 检测操作栏图标长按

android - ActionBarSherlock中设置Home应用程序图标的方法

android - 上下文操作模式与 float 菜单

android - 支持 ActionBar 不会使用 API 21 显示正确的颜色