2012-08-01 15 views
11

Ich versuche, das Thema für die PreferenceActivity in meiner App zu ändern, und ich kann es einfach nicht funktionieren.Wie kann ich das PreferenceActivity-Thema ändern?

Dies ist das xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 

     <SwitchPreference android:title="Auto Clear" android:key="autoclear" android:summary="Clear the command line when the code is being executed." android:defaultValue="false"/> 
     <ListPreference android:title="Choose a theme" android:negativeButtonText="" android:dialogTitle="" android:key="theme" android:entries="@array/themesList" android:entryValues="@array/themesList" android:defaultValue="Default" /> 

</PreferenceScreen> 

Und das ist die PreferenceActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    this.setTheme(R.style.AppTheme); 

    addPreferencesFromResource(R.xml.preferences); 

} 

Und das Ergebnis ist:

Result

+0

Möchten Sie das Thema für Ihre gesamte App oder nur die PreferenceActivity ändern? –

+0

hast du diese gesehen. http://udinic.wordpress.com/2011/08/18/dress-up-your-preferenceactivity/ http://liquidlabs.ca/2011/10/17/override-android-preference-activity-colors/ – san

Antwort

16

Haben Sie das Thema versucht, die Anwendung auf das Aktivitäts-Tag im Manifest? Dies ist, wie ich es vorher getan haben -

<activity 
    android:label="@string/app_name" 
    android:name="com.example.MyPreferenceActivity" 
    android:theme="@android:style/Theme.Black" 
    android:exported="true" 
    android:icon="@drawable/ic_launcher"></activity> 

EDIT:

Die andere Option ist, dass Sie versuchen, zu überschreiben könnte onApplyThemeResource(Resources.Theme theme, int resid, boolean first). Beim Betrachten des Android-Quellcodes ruft setTheme intern die Methode auf.

/** 
* Called by {@link #setTheme} and {@link #getTheme} to apply a theme 
* resource to the current Theme object. Can override to change the 
* default (simple) behavior. This method will not be called in multiple 
* threads simultaneously. 
* 
* @param theme The Theme object being modified. 
* @param resid The theme style resource being applied to <var>theme</var>. 
* @param first Set to true if this is the first time a style is being 
*    applied to <var>theme</var>. 
*/ 
protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) { 
    theme.applyStyle(resid, true); 
} 
+0

Aber ich möchte das Thema programmatisch ändern, weil in den Einstellungen der Benutzer das Thema ändern kann. Jedes Mal, wenn die PreferenceActivity startet, möchte ich das Thema über den Code ändern. –

+0

Ahh ich verstehe. Ich habe meinen Beitrag oben aktualisiert. Hoffnung, die hilft, das Problem zu lösen. – shri046

+0

Danke Mann !!! es funktionierte!!! –

4

Wenn Sie den Hintergrund ändern möchten können Sie

verwenden
public class FractalPreferenceActivity extends PreferenceActivity { 
    ....... 

    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setBackgroundDrawableResource(R.drawable.gradient); 
    getListView().setBackgroundColor(Color.TRANSPARENT); 
    getListView().setCacheColorHint(Color.TRANSPARENT); 

      ....... 
    } 

}

+0

Es ist nicht nur der Hintergrund, das R.style.AppTheme ist ein ganz neues Thema. –

8

ich endlich herausgefunden, wie Thema "PreferenceActivity" programmatisch (über Java-Code) ändern

Um das Thema zu ändern, gehen Sie wie folgt vor:

 @Override 
     public void onCreate(Bundle savedInstanceState) { 
     setTheme(R.style.Holo_Theme_Light); 
     super.onCreate(savedInstanceState); 
     } 

Rufen Sie immer setTheme(R.style.yourtheme); Methode vor super.onCreate(savedInstanceState); Methode. Dadurch wird das Ergebnis wie unten gezeigt erzeugt.

enter image description here

Das ist alles.

Wenn Sie setTheme(R.style.yourtheme); Methode nach super.onCreate(savedInstanceState); Methode aufrufen, wird das Ergebnis wie unten angezeigt.

enter image description here

Hinweis: Themen durch verschachtelte PreferenceScreen erkennen nicht. Um ein Thema auf diesen verschachtelten PreferenceScreen anzuwenden, müssen Sie eine andere PreferenceActivity für diesen verschachtelten PreferenceScreen vornehmen und dort die Methode setTheme(R.style.yourtheme); aufrufen.

0

ich persönlich diesen Ansatz: für API unter 11 I verwenden (Werte Verzeichnis, themes.xml-Datei):

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <style name="MyTheme" parent="@android:style/Theme.Light.NoTitleBar"></style> 

</resources> 

für höhere (zB Werte-v14-Verzeichnis, Themen.xml-Datei):

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <style name="MyTheme" parent="@android:style/Theme.Holo.Light.NoActionBar"></style> 

</resources> 

und manifestiert:

<application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

Android wird ein Thema wählen, basierend auf Geräte API automatisch, und keine Notwendigkeit, alle Themen in Aktivitäten (Manifest) oder grammatisch in Code angeben ..

.

themes

0

das wird dumm klingen, aber setTheme() verwendet, wird auf alle Fragmente arbeiten, aber nicht die Haupt prefe Rence-Aktivität. Legen Sie dies in der Manifestdatei fest und es wird plötzlich anfangen zu arbeiten.

stellte ich das Thema dynamisch basierend auf Benutzereinstellungen, setTheme() vor den onCreate von Theme-Manager-Objekt aufrufen (es doles auch verschiedene Farben und drawables aus, die durch das Thema geändert werden kann, das will ich nicht in Stilen festlegen. .. hauptsächlich weil es zu verwirrend ist um herauszufinden was was ist.

Keine Ahnung, warum die Einstellung im Manifest setTheme() funktioniert. Nur ein kleiner Fehler, der für die Präferenzaktivität typisch ist.

Verwandte Themen