如何更改ActionBar中MediaRouteButton的样式?

Act*_*thy 12 android google-cast chromecast

我意识到我可能在风格和主题方面做了一些根本性的错误,但我仍然是一个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"/>
Run Code Online (Sandbox Code Playgroud)

但是,这给了我:

android/res/menu/main.xml:24:错误:错误:找不到与给定名称匹配的资源('actionButtonStyle',值为'@ android:style/Theme.MediaRouter.Light').

Ali*_*daf 8

如果您不想更改图标的颜色,框架将根据操作栏的主题选择正确的颜色(暗或亮),因此对于具有浅色背景的操作栏,它将选择更暗的图标,反之亦然; 这是一个具有两个不同主题的示例应用程序,分别是Theme.AppCompat.Light和Theme.AppCompat(其他一切都相同):

这是使用Theme.AppCompat.Light主题

这是使用Theme.AppCompat

如您所见,自动选择适当的一个.如果您想根据品牌要求使用不同的颜色,最简单的方法是将以下图像添加到项目中(通常分辨率在mdpi,hdpi,..下):

  • mr_ic_media_route_disabled_holo_dark.png
  • mr_ic_media_route_off_holo_dark.png
  • mr_ic_media_route_on_0_holo_dark.png
  • mr_ic_media_route_on_1_holo_dark.png
  • mr_ic_media_route_on_2_holo_dark.png

(如果您使用的是轻型操作栏主题,请将" dark " 替换为" light ").看看Google Cast>示例应用程序 (Cast Icons)部分的资产,以了解这些图像是什么,并根据这些图像构建自己的图像.


Act*_*thy 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不。我还在用这个。或许谷歌发布官方API时会有更好的方式。 (2认同)

ste*_*ker 5

您现在可以使用自定义 drawable 轻松更改它。只需在您的投射按钮上调用此方法即可。

mediaRouteButton = (MediaRouteButton) findViewById(R.id.media_route_button);
mediaRouteButton.setRemoteIndicatorDrawable(yourDrawable);
Run Code Online (Sandbox Code Playgroud)