我意识到我可能在风格和主题方面做了一些根本性的错误,但我仍然是一个Android新手,所以请原谅我的无知。我正在尝试将MediaRouteButton的样式从默认的暗色更改为浅色,因为我有一个轻型ActionBar。我的MediaRouteButton在ActionBar中实现如下:
<item
android:id="@+id/menu_item_cast"
android:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
android:actionViewClass="android.support.v7.app.MediaRouteButton"
android:showAsAction="always"
android:actionButtonStyle="@android:style/Theme.MediaRouter.Light"/>
但是,这给了我:
android / res / menu / main.xml:24:错误:错误:找不到与给定名称匹配的资源(在'actionButtonStyle'中,值为'@ android:style / Theme.MediaRouter.Light')。
答案 0 :(得分:7)
我最终反编译android-support-v7-mediarouter.jar以查看发生了什么。随着代码可用,我能够扩展MediaRouteButton并通过反射黑客设置私有Drawable。必须有更好的方法吗?
public class CustomMediaRouteButton extends MediaRouteButton {
private static final String TAG = "CustomMediaRouteButton";
public CustomMediaRouteButton(Context context){
this(context, null);
}
public CustomMediaRouteButton(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.mediaRouteButtonStyle);
}
public CustomMediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Drawable d = getResources().getDrawable(R.drawable.mr_ic_media_route_holo_light);
setRemoteIndicatorDrawable(d);
}
private void setRemoteIndicatorDrawable(Drawable d) {
try {
Field field = MediaRouteButton.class.getDeclaredField("mRemoteIndicator");
field.setAccessible(true);
Drawable remoteIndicator = (Drawable)field.get(this);
if (remoteIndicator != null) {
remoteIndicator.setCallback(null);
unscheduleDrawable(remoteIndicator);
}
field.set(this, d);
if (d != null) {
d.setCallback(this);
d.setState(getDrawableState());
d.setVisible(getVisibility() == 0, false);
}
} catch (Exception e) {
Log.e(TAG, "problem changing drawable:" + e.getMessage());
}
refreshDrawableState();
}
}
答案 1 :(得分:7)
如果您不想更改图标的颜色,框架会根据操作栏的主题选择正确的颜色(黑暗或浅色),因此对于具有浅色背景的操作栏,它会选择更暗的图标反之亦然;这是一个具有两个不同主题的示例应用程序,分别是Theme.AppCompat.Light和Theme.AppCompat(其他一切都相同):
如您所见,自动选择合适的一个。如果您想根据品牌要求使用不同的颜色,最简单的方法是将以下图像添加到您的项目中(通常分辨率为mdpi,hdpi,..):
(如果您使用的是轻型操作栏主题,请将“深色”替换为“光”)。查看Google Cast > Sample Apps处的资产(“投射图标”部分),了解这些图像是什么,并根据这些图像构建自己的图像。
答案 2 :(得分:3)
您现在可以使用自定义drawable轻松更改它。 只需在演员按钮上调用此方法即可。
{{1}}
答案 3 :(得分:1)
我找到了一种通过代码更改MediaRouteButton颜色的方法,并且很容易完成,无需触及现有代码。
MediaRouteButton将根据您传递的上下文主题设置自己的样式。您可以创建ContextThemeWrapper来包装上下文,然后将其传递给MediaRouteActionProvider。
以下是一个例子:
MenuItem item = menu.add(Menu.NONE, R.id.menu_cast, Menu.NONE, "Cast");
MenuItemCompat.setActionProvider(item, new MediaRouteActionProvider(new ContextThemeWrapper(this, R.style.AppTheme)));
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
这里的R.style.AppTheme是一个从Theme.AppCompat扩展的主题,它是一个黑暗的主题,因此转换按钮将始终以浅色版本显示。您还可以传递灯光主题,使投射按钮在黑暗版本中表现。您也可以动态更改它,只是使选项菜单无效,它应该使用新主题重新创建操作提供程序。
我正在使用支持库23.1.1并且没有以这种方式发现任何问题。
答案 4 :(得分:1)
如果要更改使用的图标(而不仅仅是样式),则需要将它们命名为与here完全相同的名称。例如,对于灯光主题,您需要为每个具有名称的分辨率设置一组图标:private static void ProcessFilesInParallel(int[] Ids, string[] files)
{
Parallel.For(0, Ids.Length, i =>
{
var fileId = Ids[i];
//this is returning the wrong fileName
var fileName = GetControlFileMetaDataFromDB(fileId);
_cd.TryAdd(fileId, fileName);
});
}
,ic_cast_on_light.png
,ic_cast_on_0_light.png
,ic_cast_on_1_light.png
,{{1} },ic_cast_on_2_light.png
。
答案 5 :(得分:0)
您应该可以通过将样式应用于您的活动来更改样式,例如在AndroidManifest.xml中。如果你想改变drawable,我成功地将mr_ic_media_route_holo_light drawable添加到我的项目中。只需将其添加到drawables文件夹并根据需要进行自定义。示例:https://github.com/android/platform_frameworks_support/blob/master/v7/mediarouter/res/drawable/mr_ic_media_route_holo_light.xml