【问题标题】:Why is Cast MediaRouteButton always white even on Holo.Light Action-Bar?为什么即使在 Holo.Light 操作栏上 Cast MediaRouteButton 也总是白色?
【发布时间】:2015-04-07 18:13:47
【问题描述】:

我正在从自定义 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”的活动:

<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”(黑暗)主题一样?

【问题讨论】:

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


    【解决方案1】:

    取自:Link

    注意:在实现提供媒体路由器的活动时 接口,您必须扩展 ActionBarActivity 或 FragmentActivity 来自 Android 支持库,即使您的 android:minSdkVersion 是 API 11 或更高版本。

    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

    【讨论】:

    • 我的主要活动实际上来自v4.FragmentActivity,但我想这还不够。当我扩展 ActionBarActivity(尚未升级到 SDK v22)时,按钮的样式正确。但是,它现在以不同的方式出现,因为当操作栏显示或隐藏时,屏幕底部会在动画期间显示某种垃圾(Android 5.1)。有什么方法可以手动设置R.attr.isLightTheme,从而与v4.FragmentActivity一起正常工作?
    • @BrianWhite 是的,当然,您可以切换isLightTheme。您拥有 support-v7 中定义的每个 attr。将&lt;item name="isLightTheme"&gt;true&lt;/item&gt; 添加到您在问题中的设置中。文档不是最新的,因为(如您所述)FragmentActivity 选项不再起作用。 当我扩展 ActionBarActivity 时(尚未升级到 SDK v22)... 不确定您的意思 AppCompatActivity,这与API 级别。 (续)
    • @BrianWhite (contd.) 你的意思是 Android 5.0 吗? --> _...动画期间的某种垃圾(Android 5.1)。 _ 我问是因为您提到您尚未迁移到 SDK v22。无论如何,我几乎可以肯定您所观察到的是由于没有窗口 bg - 您在此处请求:&lt;item name="android:windowBackground"&gt;@null&lt;/item&gt; 。由于您要覆盖ActionBar,因此请尝试为您的活动布局的基本容器设置一个纯色背景(任何具有完整 alpha 的颜色都可以)。
    • @BrianWhite 请注意,通过在AppTheme 下设置isLightTheme,您只是在修复泄漏。在此过程中,您可能需要再修复一些。例如:MediaRouteChooserDialog 利用MediaRouterThemeHelper.getThemeResource(...) 获取设置为R.attr.mediaRouteOffDrawable 的可绘制资源ID。在您的情况下,返回的值将为 0,因为 AppTheme 未定义 R.attr.mediaRouteOffDrawableTheme.AppCompat.* 定义)。要解决此问题,请在 support-v7 的主题文件(Theme.AppCompat.Light 下)中查找 mediaRouteOffDrawable,并将其反映回 AppTheme
    • 无论我当前的 SDK 版本是什么,它都有 ActionBarActivity 但没有 AppCompatActivity。由于我上次使用 API21 的版本更新了我的 SDK,我认为它是与 API22 的版本一起发布的。我已经分配了windowBackground 项目@null。当 Actionbar 显示时,屏幕会向上跳(底部有垃圾),然后向下滑动。当 ActionBar 隐藏时,屏幕向上滑动,底部显示垃圾,然后向下跳。将isLightTheme 项目添加到我的主题中可以正确地为按钮着色,但原本浅色的对话框现在变暗了。
    【解决方案2】:

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

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

    【讨论】:

    • 鉴于 bar 按钮会随着 MediaRouter 更改连接状态而更改,是否会继续应用过滤器?
    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2022-09-29
    • 2015-03-05
    相关资源
    最近更新 更多