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

Why is Cast MediaRouteButton always white even on Holo.Light Action-Bar?

我正在从自定义 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>

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

<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" 可绘制对象 -- 我以前有,但删除了它们。

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

按钮功能齐全,只是颜色不对。按下按钮时出现的 "chooser" 对话框样式为 "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 的深色主题版本 ==> ... 总是白色。

请注意,Caution 声明暗示您的父主题必须是 AppCompat 主题 - AppCompatActivity(或 ActionBarActivity)无法与 android:Theme.*.

编辑:

这里发生了很多讨论:Link

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

如果一切都失败了,您可以在 onCreate() 中以编程方式更改颜色:

   ImageButton button = ((ImageButton) toolbar.getChildAt( ... )); // The view index of the button
    button.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);