Тема диалога подключения MediaRouteActionProvider

#android #android-theme #chromecast

#Android #android-тема #chromecast

Вопрос:

Я попытался изменить тему диалога подключения MediaRouteActionProvider. Я использую в своем приложении светлую тему с темной панелью действий, поэтому диалоговое окно имеет темно-серое содержимое, но фон темный.. Когда приложение подключено к устройству, другие диалоги в порядке, они имеют белый фон с правильной темой. (Для примера в VideoMediaRouteControllerDialog и в диалоговом окне отключения.)

Есть ли у вас какие-либо идеи, как я могу изменить тему диалога подключения?

Большое вам спасибо!

// Скриншот 1: Диалоговое окно подключения (с проблемой темы)

// Скриншот 2: Диалоговое окно контроллера (с правильной, необходимой темой)

Ответ №1:

К сожалению, этот диалог не соответствует стандартной теме (все диалоги в Android в целом довольно недружелюбны, но с этим одним из самых сложных в работе). Поскольку это диалоговое окно предоставляется media router, вы можете предоставить настраиваемую тему, только если полностью замените ее своим собственным диалогом.

Вы можете попробовать подклассы MediaRouteDialogFactory и переопределить onCreateChooserDialogFragment() метод и передать свою реализацию в ActionProvide :

mediaRouteActionProvider.setDialogFactory(yourDialogFactoryImlementation)

Вы можете взглянуть на CCL, где я делаю аналогичную вещь не для диалогового окна выбора, а для контроллера.

Комментарии:

1. Это решение работает для меня, для MediaRouteChooserDialog, а не для MediaRouteControllerDialog. Я сделал короткую заметку о более подробной информации: explod.io/setting-the-theme-of-mediaroutechooserdialog

2. Али, похоже, добавил setMediaRouteDialogFactory CastConfiguration , поскольку на этот вопрос был дан ответ. Таким образом, вы можете создать свою собственную фабрику со своей собственной темой и передать ее CastConfiguration настройке, которая будет использоваться в диалогах

Ответ №2:

Прямо сейчас проблема с тематикой этих диалогов — неправильная тема, примененная к диалоговому окну. Вы можете переопределить темы, используемые в 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>
  

Комментарии:

1. Мне пришлось использовать 2-й стиль с заменой имени на «Theme. MediaRouter. Свет. DarkControlPanel»

2. Также относится к Android Google Cast v3 SDK.

Ответ №3:

Что я сделал, так это извлек источник библиотеки mediarouter appcompat из GitHub, затем я исправил тематизацию и перестроил все это в свою собственную библиотеку mediarouter.

То, что вы ищете в коде MediaRouteChooserDialog , и даже там, конструктор, который принимает только a Context в качестве параметра, поскольку это тот, который вызывается onCreateChooserDialog() in MediaRouteChooserDialogFragment .

Я был ленив, поэтому я просто поставил android.R.style.Theme_Holo_Light_Dialog вместо 0 в конструкторе, и все сработало просто отлично. Но, конечно, вы всегда можете поискать более сложное решение.

Ответ №4:

Я заставил его работать так, как описал @Naddaf. Вам необходимо расширить MediaRouteDialogFactory (вы можете установить для этого значение MediaRouteActionProvider или MediaRouteButton с помощью setDialogFactory()) и переопределить метод:

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

Затем в вашем пользовательском интерфейсе mediaroutechooserdialogfragment переопределите:

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

И в пользовательском каталоге mediaroutechooserdialog создайте конструктор, в котором вы устанавливаете свою тему holo light.

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

Надеюсь, это поможет!

Ответ №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 для заголовка / субтитров. В случае, если ваше приложение использует темную тему, вам следует перезаписать фон, используя тему ниже, и изменить константу THEME_DIALOG в классе MediaRouteActionProviderThemeLight:

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

Чтобы использовать светлую тему с темными элементами управления, используйте следующую тему. Не забудьте установить в качестве основного цвета темный цвет, индикатор громкости автоматически устанавливается на светлый / темный в зависимости от основного цвета.

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