java 覆盖默认的 Android 主题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4833947/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Override default Android themes
提问by typeoneerror
I've been able to override any themes that have names with "android:" prepended to them, but the Android themes.xml also defines properties that don't seem to be able to be overridden. For example:
我已经能够覆盖任何名称前带有“android:”的主题,但 Android themes.xml 还定义了似乎无法覆盖的属性。例如:
<!-- Variation on the Light theme that turns off the title -->
<style name="Theme.Codebase" parent="android:style/Theme.Light">
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="colorBackground">@color/off_white</item>
</style>
colorBackground is defined in the Theme.Light xml, but adding this here gives me a
colorBackground 是在 Theme.Light xml 中定义的,但是在这里添加它给了我一个
/res/values/styles.xml:10: error: Error: No resource found that matches the given name: attr 'colorBackground'.
error. How do I override that style for the Application as a whole?
错误。如何覆盖整个应用程序的样式?
采纳答案by Malcolm
You can overwrite standard attributes the same way you modified such properties as windowNoTitle
, just don't forget to add android:
prefix like this:
您可以像修改这样的属性一样覆盖标准属性windowNoTitle
,只是不要忘记添加这样的android:
前缀:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="SEclubTheme" parent="@android:style/Theme">
<item name="android:colorForeground">@color/bright_foreground_dark</item>
<item name="android:colorBackground">@color/background_dark</item>
</style>
</resources>
回答by Stephen Quan
Without the attr prefix, your colorBackground becomes an attribute that you need to define. Consider the following example where theme_dependent_icon
is defined in a styles.xml
:
如果没有 attr 前缀,您的 colorBackground 将成为您需要定义的属性。考虑以下示例,其中theme_dependent_icon
在 a 中定义styles.xml
:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<declare-styleable name="custom_menu">
<attr name="theme_dependent_icon" format="reference"/>
</declare-styleable>
<style name="MyDarkTheme" parent="android:Theme" >
<item name="theme_dependent_icon">@drawable/ic_search_dark</item>
</style>
<style name="MyLightTheme" parent="android:Theme.Light" >
<item name="theme_dependent_icon">@drawable/ic_search_light</item>
</style>
</resources>
Then, you can use the attribute via ?attr/theme_dependent_icon
in your main_activity.xml
:
然后,您可以?attr/theme_dependent_icon
在您的main_activity.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?attr/theme_dependent_icon" />
</LinearLayout>
In this example, because I used custom theme names MyDarkTheme
and MyLightTheme
, they need to be selected during onCreate
of your main activity prior to setContentView
, i.e.
在此示例中,因为我使用了自定义主题名称MyDarkTheme
和MyLightTheme
,因此需要在onCreate
之前的主要活动期间选择它们setContentView
,即
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.MyDarkTheme); // causes ic_search_dark.png to be shown
// setTheme(R.style.MyLightTheme); // causes ic_search_light.png to be shown
setContentView(R.layout.main_activity);
}
Calling setTheme() is one way of selecting a theme during runtime. Another way is to define multiple versions of styles.xml
in your resources under the values
, values-11
, values-14
corresponding to default theme, theme for Android 3.0 (API-11) and theme for Android 4.0 (API-14).
调用 setTheme() 是在运行时选择主题的一种方式。另一种方法是定义的多个版本styles.xml
中下你的资源values
,values-11
,values-14
对应的默认主题,主题为Android 3.0(API-11)和主题的Android 4.0(API-14)。