ChromeCast媒体路由按钮的样式设计

3
我似乎无法使MediaRoute按钮在我的实心ActionBar中显示为“白色”。我的问题是:我们如何在不更改可绘制名称的情况下设置MediaRoute按钮的浅色或深色样式?查看类似问题:如何更改ActionBar中的MediaRouteButton样式? , 接受的解决方案只是使用自己的一组MediaRoute可绘制对象,并交换名称light<>dark。对于我的应用程序,我有3种不同的样式:light-ActionBar、dark-ActionBar和light solid-ActionBar。我不能简单地交换可绘制对象名称,因为我需要前两个主题的深色和浅色都正确显示。为了正确显示实心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并强制使用@drawable/mr_ic_media_route_holo_dark,但无论我做什么都没有任何区别。
如何在不更改可绘制名称的情况下使MediaRoute按钮变亮或变暗? 是否有一个简单的样式可以重写,我们可以在其中设置自己的MediaRoute可绘制对象?
2个回答

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。我正在调试它,但一直无法解决。如果您能确认这个问题是否已经解决,我会接受这个答案。 - Tim Malseed

0

我也遇到了空指针异常的类似问题。虽然我没有使用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;
}
....

希望这能有所帮助。


这不是这个问题的答案。 - mr.icetea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接