2011-01-28 13 views
8

Sono stato in grado di ignorare qualsiasi tema con nomi preceduti da "android:", ma Android themes.xml definisce anche proprietà che non sembrano poter essere sovrascritte. Per esempio:Ignora i temi predefiniti Android

<!-- 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 è definito nel xml Theme.Light, ma l'aggiunta di questa qui mi dà un errore di

/res/values/styles.xml:10: error: Error: No resource found that matches the given name: attr 'colorBackground'. 

. Come faccio a sovrascrivere quello stile per l'applicazione nel suo complesso?

+0

Quei tag senza Android: sembrano essere definiti all'interno dei file attr xml nella stessa cartella res/values ​​nel generatore Android. http://android.git.kernel.org/?p=platform/frameworks/base.git;a=tree;f=core/res/res/values;hb=HEAD Guarda attrs.xml e attrs_manifest.xml I penso che sia necessario importarli in qualche modo usando xmlns, o aggiungere file simili alla cartella dei valori, ma non ne so abbastanza su xml per essere sicuro. – Jems

risposta

8

È possibile sovrascrivere gli attributi standard allo stesso modo si è modificato tali proprietà come windowNoTitle, basta non dimenticare di aggiungere il prefisso android: come questo:

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

Sì, l'ho capito. Sono ancora perplesso su come "colorBackground" funzioni da solo nei loro temi. Qualche idea? La migliore risposta per ora! – typeoneerror

+0

Che posso dire. Definisce il parametro 'colorBackgroundCacheHint', che viene utilizzato negli stili' ListView' per eseguire alcune ottimizzazioni basate sul presupposto che le viste siano sempre disegnate su uno sfondo a tinta unita. Oltre a ciò sembra che non ci sia alcun uso per questo attributo. Ciò che è più importante è l'attributo 'windowBackground' che, come suggerisce il nome, definisce lo sfondo della finestra. – Malcolm

3

senza il prefisso attr, il vostro colorBackground diventa un attributo che si bisogno di definire. Si consideri il seguente esempio in cui theme_dependent_icon è definito in un 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> 

Quindi, è possibile utilizzare l'attributo tramite ?attr/theme_dependent_icon nelle 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 questo esempio, perché ho usato i nomi a tema personalizzato MyDarkTheme e MyLightTheme, devono essere selezionati durante il onCreate dell'attività principale prima di setContentView, ovvero

@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); 
} 

Chiamare setTheme() è un modo di selezionare un tema durante il runtime. Un altro modo per definire più versioni dinelle risorse sotto lo values, values-11, values-14 corrisponde al tema predefinito, tema per Android 3.0 (API-11) e tema per Android 4.0 (API-14).