我试图更改MediaRouteActionProvider连接对话框的主题。我在我的应用程序中使用了一个带有Dark Actionbar的Light主题,所以对话框有深灰色内容,但背景很暗.. 当应用程序连接到设备时,其他对话框都可以,它们具有正确主题的白色背景。 (例如,VideoMediaRouteControllerDialog和断开连接对话框中的例子。)
您有什么想法,我该如何更改连接对话框的主题?
非常感谢!
// Screenshot 1:连接对话框(主题问题)
// Screenshot 2:控制器对话框(使用正确的,需要的主题)
答案 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>