MediaRouteActionProvider连接对话框主题



我试图改变MediaRouteActionProvider连接对话框的主题。我在我的应用程序中使用了一个带有深色动作栏的浅色主题,所以对话框有深灰色的内容,但是背景是深色的。当应用程序连接到设备时,其他对话框都没问题,它们有白色背景和正确的主题。(例如在videomediaroutecontrolerdialog和disconnect对话框)

你知道如何改变连接对话框的主题吗?

非常感谢!

//截图1:连接对话框(与主题问题)

//截图2:控制器对话框(右,需要的主题)

不幸的是,这个对话框没有遵循标准主题(Android中的对话框通常都非常不友好,但这是最难使用的对话框之一)。因为这个对话框是由media router提供的,你只能提供一个自定义的主题,如果你把它完全替换成你自己的对话框。

您可以尝试子类化MediaRouteDialogFactory并覆盖onCreateChooserDialogFragment()方法,并将您的实现传递给ActionProvide:

mediaRouteActionProvider.setDialogFactory(yourDialogFactoryImlementation)

你可以看看CCL,我在那里做了类似的事情,不是为选择器对话框,而是为控制器。

现在这些对话框的主题有问题-错误的主题应用于对话框您可以覆盖在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>

我所做的是从GitHub中提取mediarouter appcompat库源代码,然后我修复主题并将整个东西重建为我自己的自定义mediarouter库。

你在代码中寻找的是MediaRouteChooserDialog,即使在那里,构造函数也只接受Context作为参数,因为它是MediaRouteChooserDialogFragmentonCreateChooserDialog()调用的那个。

我很懒,所以我只是把android.R.style.Theme_Holo_Light_Dialog而不是0放在构造函数中,它工作得很好。当然,你也可以寻找更复杂的解决方案。

我让它像@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中创建一个构造函数,用于设置holo光主题。

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

希望这对你有帮助!

根据其他的答案,这个对我有用:

在菜单项

中设置自定义操作提供程序
<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>

最新更新