MediaRouteActionProvider连接对话框主题

时间:2014-06-16 14:24:18

标签: android android-theme chromecast

我试图更改MediaRouteActionProvider连接对话框的主题。我在我的应用程序中使用了一个带有Dark Actionbar的Light主题,所以对话框有深灰色内容,但背景很暗.. 当应用程序连接到设备时,其他对话框都可以,它们具有正确主题的白色背景。 (例如,VideoMediaRouteControllerDialog和断开连接对话框中的例子。)

您有什么想法,我该如何更改连接对话框的主题?

非常感谢!

// Screenshot 1:连接对话框(主题问题)

// Screenshot 2:控制器对话框(使用正确的,需要的主题)

5 个答案:

答案 0 :(得分:3)

不幸的是,对话框并不遵循标准主题(Android中的Dialogs一般都非常不友好,但其中一个是最难处理的)。由于该对话框由媒体路由器提供,因此如果您使用自己的对话框完全替换该对话框,则只能提供自定义主题。

您可以尝试继承MediaRouteDialogFactory并覆盖onCreateChooserDialogFragment()方法,并将您的实施传递给ActionProvide

mediaRouteActionProvider.setDialogFactory(yourDialogFactoryImlementation)

你可以看一下CCL我做类似的事情,不是选择对话框而是控制器。

答案 1 :(得分:3)

现在主题这些对话有问题 - wrong theme applied to Dialog 您可以覆盖 MediaRouterThemeHelper

中使用的主题
 <style name="Theme.MediaRouter.Light.DarkControlPanel">
    <item name="mediaRoutePlayDrawable">@drawable/mr_ic_play_dark</item>
    <item name="mediaRoutePauseDrawable">@drawable/mr_ic_pause_dark</item>
    <item name="mediaRouteCastDrawable">@drawable/mr_ic_cast_dark</item>
    <item name="mediaRouteAudioTrackDrawable">@drawable/ic_audiotrack</item>
    <item name="mediaRouteControllerPrimaryTextStyle">@style/Widget.MediaRouter.ControllerText.Primary.Dark</item>
    <item name="mediaRouteControllerSecondaryTextStyle">@style/Widget.MediaRouter.ControllerText.Secondary.Dark</item>
</style>
<style name="Theme.MediaRouter.LightControlPanel">
    <item name="mediaRoutePlayDrawable">@drawable/mr_ic_play_light</item>
    <item name="mediaRoutePauseDrawable">@drawable/mr_ic_pause_light</item>
    <item name="mediaRouteCastDrawable">@drawable/mr_ic_cast_light</item>
    <item name="mediaRouteAudioTrackDrawable">@drawable/mr_ic_audiotrack_light</item>
    <item name="mediaRouteControllerPrimaryTextStyle">@style/Widget.MediaRouter.ControllerText.Primary.Light</item>
    <item name="mediaRouteControllerSecondaryTextStyle">@style/Widget.MediaRouter.ControllerText.Secondary.Light</item>
</style>

答案 2 :(得分:2)

我所做的是从GitHub中提取mediarouter appcompat库源,然后修复主题并将整个事物重建为my own custom mediarouter library

您在代码中寻找的内容是MediaRouteChooserDialog,即使在那里,构造函数只需要Context作为参数,因为那个被调用的那个onCreateChooserDialog()中的MediaRouteChooserDialogFragment

我很懒,所以我只是在构造函数中放置android.R.style.Theme_Holo_Light_Dialog而不是0,它运行得很好。但当然,您总能找到更复杂的解决方案。

答案 3 :(得分:1)

我让它与@Naddaf所描述的相似。您需要扩展MediaRouteDialogFactory(您可以使用setDialogFactory()将其设置为MediaRouteActionProvider或MediaRouteButton)并覆盖该方法:

    @Override
    public MediaRouteChooserDialogFragment onCreateChooserDialogFragment(){
        return new CustomMediaRouteChooserDialogFragment();
    }

然后在CustomMediaRouteChooserDialogFragment覆盖:

    @Override
    public CustomMediaRouteChooserDialog onCreateChooserDialog(Context context, Bundle savedInstanceState)
    {
        return new CustomMediaRouteChooserDialog(context);
    }

在CustomMediaRouteChooserDialog中创建一个构造函数,在其中设置你的全息光主题。

    public CustomMediaRouteChooserDialog(Context context)
    {
        super(context, android.R.style.Theme_Holo_Light_Dialog);
    }

希望这有帮助!

答案 4 :(得分:1)

基于其他答案,这对我有用:

在菜单项

中设置自定义操作提供程序
<item
    android:id="@+id/media_route_menu_item"
    android:title="@string/cast_menu_title"
    app:actionProviderClass="MediaRouteActionProviderThemeLight"
    app:showAsAction="always"/>

这是使用灯光主题的自定义操作提供程序

public class MediaRouteActionProviderThemeLight extends MediaRouteActionProvider {

private static final int THEME_DIALOG = android.support.v7.mediarouter.R.style.Theme_MediaRouter_Light;

/**
 * Creates the action provider.
 *
 * @param context The context.
 */
public MediaRouteActionProviderThemeLight(Context context) {
    super(context);
    setDialogFactory(new MediaRouteDialogFactoryThemeLight());
}

private static class MediaRouteDialogFactoryThemeLight extends MediaRouteDialogFactory {
    @NonNull
    @Override
    public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() {
        return new MediaRouteChooserDialogFragmentThemeLight();
    }

    @NonNull
    @Override
    public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
        return new MediaRouteControllerDialogFragmentThemeLight();
    }

}

public static class MediaRouteChooserDialogFragmentThemeLight extends MediaRouteChooserDialogFragment {
    @Override
    public MediaRouteChooserDialog onCreateChooserDialog(Context context, Bundle savedInstanceState) {
        return new MediaRouteChooserDialog(context, THEME_DIALOG);
    }
}

public static class MediaRouteControllerDialogFragmentThemeLight extends MediaRouteControllerDialogFragment {

    @Override
    public MediaRouteControllerDialog onCreateControllerDialog(Context context, Bundle savedInstanceState) {
        return new MediaRouteControllerDialog(context, THEME_DIALOG);
    }
}

}

考虑带有播放/暂停按钮和音量控制的对话框,使用主题中的素材颜色,colorPrimary作为背景,使用textColorPrimary作为标题/副标题。如果您的应用使用黑暗主题,您应该使用下面的主题覆盖背景,并更改MediaRouteActionProviderThemeLight类中的THEME_DIALOG常量:

<style name="CastAppThemeMediaRouter" parent="Theme.MediaRouter.Light">
    <item name="colorPrimaryDark">@color/primary_dark_material_light</item>
    <item name="colorPrimary">@color/primary_material_light</item>
    <item name="colorAccent">@color/accent_material_light</item>
</style>

要使用带有深色控件的灯光主题,请使用以下主题。一定要将primaryColor设置为深色,音量条会根据primaryColor自动设置为亮/暗。

<style name="CastThemeMediaRouter" parent="Theme.MediaRouter.Light.DarkControlPanel">
    <item name="colorPrimary">@color/black</item>
</style>