开发者

Override default Android themes

开发者 https://www.devze.com 2023-02-07 21:47 出处:网络
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

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:

<!-- Variation on the Light theme that turns off the title -->
<style name="Theme.Codebase" parent="android:style/Theme.Light">
    &开发者_开发技巧lt;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

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


You can overwrite standard attributes the same way you modified such properties as windowNoTitle, just don't forget to add android: prefix like this:

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


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:

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

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

@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).

0

精彩评论

暂无评论...
验证码 换一张
取 消