【问题标题】:Styling ChromeCast MediaRoute button样式化 ChromeCast MediaRoute 按钮
【发布时间】:2014-09-01 12:57:38
【问题描述】:

我似乎无法让 MediaRoute 按钮在我的实体 ActionBar 中显示为“白色”。

我的问题是:我们如何在不更改可绘制名称的情况下将 MediaRoute 按钮设置为浅色或深色?

在这里查看一个类似的问题:How do I change the style of the MediaRouteButton in the ActionBar? 接受的解决方案只是使用您自己的一组 MediaRoute 可绘制对象,并将名称交换为 lightdark。

对于我的应用,我有 3 种不同的样式:light-ActionBar、dark-ActionBar 和 light-solid-ActionBar。我不能简单地交换可绘制名称,因为我需要深色和浅色才能正确显示前两个主题。为了正确显示实体操作栏内容,我正在做这样的事情:(在此处找到以下示例:http://www.jayway.com/2014/06/02/android-theming-the-actionbar/

//Parent Light.DarkActionBar should give white ActionBar icons
<style name="AppTheme.Solid.Light" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/Widget.Solid.ActionBar</item>
    <item name="android:actionBarWidgetTheme">@style/ActionBarWidget</item>
    .
    .

//Make the ActionBar solid, but need to use 'inverse' to keep the icons/text white
<style name="Widget.Solid.ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
.
.

//**** THE ISSUE IS CAUSED BY USING THE FOLLOWING
//Make the ActionBar dropdown spinner items use the correct (white) theme as well
<style name="ActionBarWidget" parent="Theme.AppCompat.Light.DarkActionBar">
.
.

ActionBarWidget 主题是确保 ActionBar 溢出图标下拉菜单背景显示为白色而不是黑色所必需的。但是,它会导致 MediaRoute 按钮更改为它的深色主题可绘制对象,这不适合。

我尝试过覆盖 Widget.MediaRouter.MediaRouteButton 并强制 &lt;item name="externalRouteEnabledDrawable"&gt;@drawable/mr_ic_media_route_holo_dark&lt;/item&gt;,但我所做的没有任何影响。

如何在不更改可绘制名称的情况下为 MediaRoute 按钮设置浅色或深色样式? 是否有一种简单的样式可以覆盖我们可以设置自己的 MediaRoute 可绘制对象的位置?

【问题讨论】:

    标签: android android-theme chromecast android-styles


    【解决方案1】:

    尝试以下方法:

    menu.xml:

    <item
        android:id="@+id/media_route_menu_item"
        android:title="@string/media_route_menu_title"
        app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
        app:actionViewClass="com.???.MediaRouteButtonHoloDark"
        app:showAsAction="always" />
    

    MediaRouteButtonHoloDark:

    public class MediaRouteButtonHoloDark extends MediaRouteButton {
    
        public MediaRouteButtonHoloDark( Context context ) {
            this( context, null );
        }
    
        public MediaRouteButtonHoloDark( Context context, AttributeSet attrs ) {
            this( context, attrs, android.support.v7.mediarouter.R.attr.mediaRouteButtonStyle ); 
        }
    
        public MediaRouteButtonHoloDark( Context context, AttributeSet attrs, int defStyleAttr ) {
            super( getThemedContext(context), attrs, defStyleAttr);     
        }
    
        private static Context getThemedContext( Context context ) {
            context = new ContextThemeWrapper( context, android.support.v7.appcompat.R.style.Theme_AppCompat );
            return new ContextThemeWrapper( context,  android.support.v7.mediarouter.R.style.Theme_MediaRouter );
    
        }   
    }
    

    在您的代码中的某处:

    ...
    MenuItem mediaRouteMenuItem = menu.findItem( R.id.media_route_menu_item );      
    MediaRouteButton mediaRouteButton = (MediaRouteButton) MenuItemCompat.getActionView( mediaRouteMenuItem ); 
    mediaRouteButton.setRouteSelector( mMediaRouteSelector );
    ...
    

    【讨论】:

    • 感谢您的回答。我在使用 CastCompanionLibrary 时遇到问题。似乎设置自定义 actionViewClass 会导致带有 CCL 的 NullPointerException。我正在调试它,但我无法修复它。如果可以确认这是有效的,我会接受答案。
    【解决方案2】:

    空指针异常也有类似的问题。我不使用 CastCompanionLibrary,但我是这样解决的:

    1.) 不要在菜单定义中使用 app:actionProviderClass。

    <item
       android:id="@+id/media_route_menu_item"
       android:title="@string/media_route_menu_title"
       app:actionViewClass="com.???.MediaRouteButtonHoloDark"
       app:showAsAction="always" />
    

    2.) 搜索您的代码或 CCL 尝试获取 ActionProvider 的位置,如果未找到 ActionProvider,则只需使用 MediaRouteButton 搜索 ActionView。像这样:

    ....
    MenuItem mediaRouteMenuItem = menu.findItem( R.id.media_route_menu_item );
    
    MediaRouteActionProvider mediaRouteActionProvider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider( mediaRouteMenuItem );
    if (null!=mediaRouteActionProvider) {
        Log.i( TAG, "MediaRouteActionProvider found" );
        mediaRouteActionProvider.setRouteSelector( mMediaRouteSelector );
        return;
    }
    
    MediaRouteButton mediaRouteButton = (MediaRouteButton) MenuItemCompat.getActionView( mediaRouteMenuItem );
    if (null!=mediaRouteButton) {
        Log.i( TAG, "MediaRouteButton found" );
        mediaRouteButton.setRouteSelector( mMediaRouteSelector );
        return;
    }
    ....
    

    我希望,这会有所帮助。

    【讨论】:

    • 这不是这个问题的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2015-01-24
    • 2021-09-06
    • 2019-01-13
    • 2012-04-27
    • 2012-05-26
    相关资源
    最近更新 更多