【问题标题】:MediaRouteActionProvider connection dialog themeMediaRouteActionProvider 连接对话框主题
【发布时间】:2014-08-06 09:50:30
【问题描述】:

我尝试更改 MediaRouteActionProvider 连接对话框的主题。我在我的应用程序中使用带有深色操作栏的浅色主题,因此对话框具有深灰色内容,但背景是深色的.. 当应用程序连接到设备时,其他对话框正常,它们具有正确主题的白色背景。 (例如在 VideoMediaRouteControllerDialog 和断开连接对话框中。)

您知道如何更改连接对话框的主题吗?

非常感谢!

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

//Screenshot 2:控制器对话框(带有正确的、需要的主题)

【问题讨论】:

    标签: android android-theme chromecast


    【解决方案1】:

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

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

    mediaRouteActionProvider.setDialogFactory(yourDialogFactoryImlementation)

    您可以查看 CCL,我在其中做类似的事情不是针对选择器对话框,而是针对控制器。

    【讨论】:

    • 这个解决方案适用于我,适用于 MediaRouteChooserDialog,而不是 MediaRouteControllerDialog。我写了一篇关于更多细节的简短文章:explod.io/setting-the-theme-of-mediaroutechooserdialog
    • 阿里似乎在CastConfiguration 上添加了setMediaRouteDialogFactory,因为这个问题已经得到解答。因此,您可以使用自己的主题制作自己的工厂,并将其传递给 CastConfiguration 设置,该设置将被对话框使用
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我让它像@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】:

        现在这些对话框的主题有问题 - 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>
        

        【讨论】:

        • 我不得不使用第二种样式,将名称替换为“Theme.MediaRouter.Light.DarkControlPanel”
        • 也适用于 Android 的 Google Cast v3 SDK。
        【解决方案5】:

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

        在菜单项中设置自定义操作提供者

        <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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 1970-01-01
          • 2011-07-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多