我似乎无法将MediaRoute按钮显示为' white'在我坚实的ActionBar中。
我的问题是:如何在不更改可绘制名称的情况下,将MediaRoute按钮设置为浅色或深色?
在这里看一个类似的问题:How do I change the style of the MediaRouteButton in the ActionBar?接受的解决方案就是使用你自己的一套MediaRoute drawables,并将名称轻轻地交换为<> dark。
对于我的应用程序,我有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
并强制<item name="externalRouteEnabledDrawable">@drawable/mr_ic_media_route_holo_dark</item>
,但我所做的一切都无济于事。
如何在不更改可绘制名称的情况下,将MediaRoute按钮设置为浅色或深色? 是否有一种简单的样式可以覆盖我们可以设置自己的MediaRoute drawables的地方?
答案 0 :(得分: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 );
...
答案 1 :(得分: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;
}
....
我希望,这有帮助。