为什么 Cast MediaRouteButton 即使在 Holo.Light Action-Bar 上也总是白色的?
Why is Cast MediaRouteButton always white even on Holo.Light Action-Bar?
我正在从自定义 MediaRouteButton 移动到操作栏内的一个,但它无法正确显示。定制时的按钮是白色的,这正是我想要的。但是,即使操作栏是 "Holo.Light" 样式,按钮在操作栏上仍然是白色的(几乎看不到)。按钮应该是深色的。
按钮创建为 XML 菜单项:
<item
android:id="@+id/menu_item_media_route"
android:title="@string/menu_item_media_route"
android:actionViewClass="android.support.v7.app.MediaRouteButton"
android:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
android:showAsAction="always" />
我的应用的风格是“@style/AppTheme”:
<style name="AppTheme" parent="android:Theme.Holo.Light">
</style>
我的 activity 主题“@style/FullscreenActionbarTheme”:
<style name="FullscreenActionbarTheme" parent="android:Theme.Holo.Light">
<item name="android:windowFullscreen">true</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@null</item>
<item name="android:actionBarStyle">@style/FullscreenActionbar</item>
</style>
<style name="FullscreenActionbar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
</style>
我没有自定义 "ic_media_route_(on|off).png" 可绘制对象 -- 我以前有,但删除了它们。
我试过更改各种样式,虽然操作栏会变暗,但投射按钮始终为白色。 (因为它应该在深色操作栏上而不是浅色操作栏上。)
按钮功能齐全,只是颜色不对。按下按钮时出现的 "chooser" 对话框样式为 "Holo.Light".
那么,为什么我的投射按钮在 "Holo.Light" 主题上显示为白色,就好像它是 "Holo"(深色)主题一样?
取自:Link
Caution: When implementing an activity that provides a media router
interface you must extend either ActionBarActivity or FragmentActivity
from the Android Support Library, even if your android:minSdkVersion
is API 11 or higher.
ActionBarActivity
已被 AppCompatActivity
取代,因此您应该使用它。
Support-V7 MediaRouteButton
取决于此。查看 super
调用:
public MediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(MediaRouterThemeHelper.createThemedContext(context), attrs, defStyleAttr);
....
....
}
MediaRouterThemeHelper.createThemedContext(Context)
:
public static Context createThemedContext(Context context) {
boolean isLightTheme = isLightTheme(context);
return new ContextThemeWrapper(context, isLightTheme ?
R.style.Theme_MediaRouter_Light : R.style.Theme_MediaRouter);
}
isLightTheme
通过解析 R.attr.isLightTheme
<<== 这是一个支持库属性来设置。当您的父主题由框架提供时,它不会出现,例如 android:Theme.Holo.Light
.
private static boolean isLightTheme(Context context) {
TypedValue value = new TypedValue();
return context.getTheme().resolveAttribute(R.attr.isLightTheme, value, true)
&& value.data != 0;
}
所以,isLightTheme
是 false
& 你得到 MediaRouteButton
的深色主题版本 ==> ... 总是白色。
请注意,Caution 声明暗示您的父主题必须是 AppCompat 主题 - AppCompatActivity
(或 ActionBarActivity
)无法与 android:Theme.*
.
编辑:
这里发生了很多讨论:Link
可以通过聊天记录阅读尝试过的方法。最后,媒体路由器支持库似乎需要一些工作才能投入生产。在此处阅读更多信息:MediaRouteActionProvider connection dialog theme.
如果一切都失败了,您可以在 onCreate() 中以编程方式更改颜色:
ImageButton button = ((ImageButton) toolbar.getChildAt( ... )); // The view index of the button
button.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
我正在从自定义 MediaRouteButton 移动到操作栏内的一个,但它无法正确显示。定制时的按钮是白色的,这正是我想要的。但是,即使操作栏是 "Holo.Light" 样式,按钮在操作栏上仍然是白色的(几乎看不到)。按钮应该是深色的。
按钮创建为 XML 菜单项:
<item
android:id="@+id/menu_item_media_route"
android:title="@string/menu_item_media_route"
android:actionViewClass="android.support.v7.app.MediaRouteButton"
android:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
android:showAsAction="always" />
我的应用的风格是“@style/AppTheme”:
<style name="AppTheme" parent="android:Theme.Holo.Light">
</style>
我的 activity 主题“@style/FullscreenActionbarTheme”:
<style name="FullscreenActionbarTheme" parent="android:Theme.Holo.Light">
<item name="android:windowFullscreen">true</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@null</item>
<item name="android:actionBarStyle">@style/FullscreenActionbar</item>
</style>
<style name="FullscreenActionbar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
</style>
我没有自定义 "ic_media_route_(on|off).png" 可绘制对象 -- 我以前有,但删除了它们。
我试过更改各种样式,虽然操作栏会变暗,但投射按钮始终为白色。 (因为它应该在深色操作栏上而不是浅色操作栏上。)
按钮功能齐全,只是颜色不对。按下按钮时出现的 "chooser" 对话框样式为 "Holo.Light".
那么,为什么我的投射按钮在 "Holo.Light" 主题上显示为白色,就好像它是 "Holo"(深色)主题一样?
取自:Link
Caution: When implementing an activity that provides a media router interface you must extend either ActionBarActivity or FragmentActivity from the Android Support Library, even if your android:minSdkVersion is API 11 or higher.
ActionBarActivity
已被 AppCompatActivity
取代,因此您应该使用它。
Support-V7 MediaRouteButton
取决于此。查看 super
调用:
public MediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(MediaRouterThemeHelper.createThemedContext(context), attrs, defStyleAttr);
....
....
}
MediaRouterThemeHelper.createThemedContext(Context)
:
public static Context createThemedContext(Context context) {
boolean isLightTheme = isLightTheme(context);
return new ContextThemeWrapper(context, isLightTheme ?
R.style.Theme_MediaRouter_Light : R.style.Theme_MediaRouter);
}
isLightTheme
通过解析 R.attr.isLightTheme
<<== 这是一个支持库属性来设置。当您的父主题由框架提供时,它不会出现,例如 android:Theme.Holo.Light
.
private static boolean isLightTheme(Context context) {
TypedValue value = new TypedValue();
return context.getTheme().resolveAttribute(R.attr.isLightTheme, value, true)
&& value.data != 0;
}
所以,isLightTheme
是 false
& 你得到 MediaRouteButton
的深色主题版本 ==> ... 总是白色。
请注意,Caution 声明暗示您的父主题必须是 AppCompat 主题 - AppCompatActivity
(或 ActionBarActivity
)无法与 android:Theme.*
.
编辑:
这里发生了很多讨论:Link
可以通过聊天记录阅读尝试过的方法。最后,媒体路由器支持库似乎需要一些工作才能投入生产。在此处阅读更多信息:MediaRouteActionProvider connection dialog theme.
如果一切都失败了,您可以在 onCreate() 中以编程方式更改颜色:
ImageButton button = ((ImageButton) toolbar.getChildAt( ... )); // The view index of the button
button.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);