2014-06-16 78 views
1

我試圖改變MediaRouteActionProvider連接對話框的主題。我在我的應用程序中使用了Dark Actionbar的Light主題,因此對話框中有深灰色內容,但背景是黑暗的。 當應用程序連接到設備時,其他對話框都正常,它們具有白色背景且正確主題。 (例如在VideoMediaRouteControllerDialog和斷開連接對話框中。)MediaRouteActionProvider連接對話框主題

你有什麼想法,我該如何更改連接對話框的主題?

非常感謝!

// Screenshot 1:連接對話框(與主題問題)

// Screenshot 2:控制器對話框(用正確的,需要的主題)

回答

1

我所做的就是從GitHub中拉出mediarouter的appcompat庫源文件,然後修復主題並將其重建爲my own custom mediarouter library

什麼你在代碼中尋找的是MediaRouteChooserDialog,甚至在那裏,只需要一個Context作爲參數,因爲這是在MediaRouteChooserDialogFragment通過onCreateChooserDialog()被調用的一個構造函數。

我很懶,所以我只是把android.R.style.Theme_Holo_Light_Dialog而不是0在構造函數中,它工作得很好。但是,當然你總是可以尋找更復雜的解決方案。

3

不幸的對話框不遵循標準的主題(對話框在Android中都是非常不友好的,但是這是最難的一個)。由於該對話框是由媒體路由器提供的,因此如果您用自己的對話框完全替換該對話框,則只能提供自定義的主題。

你可以嘗試繼承MediaRouteDialogFactory,並覆蓋onCreateChooserDialogFragment()方法,並傳遞你的執行情況向ActionProvide

mediaRouteActionProvider.setDialogFactory(yourDialogFactoryImlementation)

你可以在我的選擇對話框做類似的事情不會在CCL看一看,但爲控制器。

+0

謝謝!我會試試看。 – Menyetur

+2

這個解決方案對我來說適用於MediaRouteChooserDialog,而不是MediaRouteControllerDialog。我在更多細節上做了簡短的介紹:http://explod.io/setting-the-theme-of-mediaroutechooserdialog/ –

+0

阿里似乎在CastConfiguration上添加了'setMediaRouteDialogFactory',因爲這已經被回答了。所以你可以用你自己的主題創建你自己的工廠,並將它傳遞給CastConfiguration,它將被對話框使用 –

1

我使它的工作類似於@Naddaf所描述的。您需要延長MediaRouteDialogFactory(您可以在此設置爲MediaRouteActionProvider或MediaRouteButton與setDialogFactory())和覆蓋的方法:在你的CustomMediaRouteChooserDialogFragment覆蓋

@Override 
    public MediaRouteChooserDialogFragment onCreateChooserDialogFragment(){ 
     return new 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); 
    } 

希望這有助於!

2

眼下主題化這些對話有問題 - 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> 
+0

我不得不用第二種方式替換名稱爲「Theme.MediaRouter.Light.DarkControlPanel 「 – coyer

+0

也適用於Android的Google Cast v3 SDK。 –

0

主題,這個工作對我來說:

設置自定義操作提供在菜單項

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