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