2010-04-11 4 views
25

Witam wszystkich mam ustawić motyw w pliku manifestu jak ten:PreferenceActivity i motyw niestosowania

android:theme="@android:style/Theme.Light" 

Ale mam problem w preferencjach działalności, w głównych preferencji tematem pokazuje ok, ale jeśli Dostaję się do sub-preferencji, temat staje się brudny, nie jest biały, jak powinien, jest cały ciemny, a czcionka jest czarna, więc nie widać zbyt wiele, a kiedy zacznę klikać na jakieś przedmioty, będą one czasami białe jak powinny, ale wkrótce potem powracają do czerni. Dzieje się tak tylko w wersji 2.1, zarówno w rzeczywistym urządzeniu, jak i emulatorze. Testowany na emulatorze z systemem 1.6 i działał poprawnie. Oto część kodu preferencji pliku xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceScreen 
     android:title="@string/account"> 
     <CheckBoxPreference 
      android:key="enable_account" 
      android:title="@string/account_use" 
      android:summary="@string/account_summ" /> 
     <EditTextPreference 
      android:key="username" 
      android:title="@string/login" 
      android:dependency="enable_account" 
      android:summary="@string/login_summ" /> 
     <EditTextPreference 
      android:key="password" 
      android:title="@string/password" 
      android:dependency="enable_account" 
      android:summary="@string/password_summ" 
      android:password="true" /> 
    </PreferenceScreen> 

A oto screenshot:

alt text http://i39.tinypic.com/16hnhh3.png

żadnego obejścia?

+0

nie bardzo pomocni może, ale używam motywu świetlnego w większości moich aplikacji, ale pozostawię preferencje w domyślnym czarnym motywie, ponieważ wydaje mi się to właściwe, mój widok jest taki, że użytkownicy oczekują, że wszystkie preferencje aplikacji będą miały ten sam styl. –

+0

Świetny pomysł! Dzięki. Jak mogę odpowiedzieć na to pytanie, jeśli odpowiedź była komentarzem? –

Odpowiedz

15

Ktoś po prostu napisali obejście w http://code.google.com/p/android/issues/detail?id=4611

W skrócie, ekrany top preferencji poziom wydaje się rozpoznać temat, ale nie te zagnieżdżone. Więc obejście zaleca utworzenie górną PreferenceActivity poziomu dla zagnieżdżonych PreferenceScreen a następnie powołując tę ​​nową działalność poprzez intencji:

<PreferenceScreen android:key="key1" 
         android:title="1 Item" 
         android:summary=""> 
     <intent android:action="android.intent.action.VIEW" 
       android:targetPackage="com.example" 
       android:targetClass="com.example.PreferenceActivity2"/> 
</PreferenceScreen> 

Nie trzeba zastosować motyw do niczego, ale samej aplikacji.

+5

Sprawdź link w odpowiedzi, teraz jest prostsze rozwiązanie, patrz Komentarz 35 – powder366

+0

Istnieje jeszcze jedno rozwiązanie łatwiejsze niż oba te rozwiązania; zobacz moją odpowiedź http://stackoverflow.com/a/25613182/231078. – Joe

+0

niezbyt @Joe – Ewoks

3

W końcu okazało się, jak zmienić motyw „PreferenceActivity” programowo (za pośrednictwem kodu Java)

Aby zmienić motyw prostu zrobić tak:

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

Zawsze zadzwonić setTheme(R.style.yourtheme); metodę przed super.onCreate(savedInstanceState); metody. W ten sposób uzyska wynik, jak pokazano poniżej.

enter image description here

To wszystko.

Jeśli połączysz metodę setTheme(R.style.yourtheme); po super.onCreate(savedInstanceState);, otrzymasz wynik jak pokazano poniżej.

enter image description here

Uwaga: motywy nie są rozpoznać przez zagnieżdżone PreferenceScreen. Aby zastosować motyw do zagnieżdżonego PreferenceScreen, musisz utworzyć inną PreferenceActivity dla tego zagnieżdżonego PreferenceScreen i tam wywołać metodę setTheme(R.style.yourtheme);.

+0

To powinno było zostać wznowione więcej. – faraday

+0

Tak, zgadzam się! Mogę potwierdzić, że działa i jest to najprostsze rozwiązanie! –

4

Można również skorzystać z tej techniki, aby zastąpić style wewnętrznych ekranów uprzywilejowane:

Kod ten ma zastosowanie styl głównego ekranu do ekranu preferencji preferencji kliknięciu.

+0

Dzięki! ... to rozwiązanie sprawdziło się u mnie. – user836026

+0

Nie ma za co! :) – webmaster

+0

To rozwiązało mój problem gładki jak jedwab! DZIĘKUJĘ CI! – aveschini

0

Jest jeszcze łatwiejsze rozwiązanie, jeśli nie masz nic przeciwko używaniu tego, co wydaje się czarną magią, aby to osiągnąć ...

Patrząc na źródło PreferenceScreen#showDialog(Bundle), widzimy, że okno dialogowe jest tworzone przy użyciu zasobu kompozycji uzyskanego za pomocą mContext.getThemeResId(), który jest następnie używany w ContextThemeWrapper.

To może pomóc nam w zasadzie, ponieważ Context wykorzystywane w PreferenceScreen jest rzeczywiście nasz PreferenceActivity, więc wszystko, co musimy zrobić, to zastąpić metodę getThemeResId() (który jest ukryty z publicznych API), aby zapewnić naszym motyw niestandardowy, a sub-PreferenceScreen używa teraz dowolnego niestandardowego zasobu motywu, jakiego potrzebowaliśmy!

/** 
* This is a hack to provide our own theme for the PreferenceScreen's dialog. 
* 
* @see android.preference.PreferenceScreen#showDialog(Bundle) 
*/ 
public int getThemeResId() { 
    return R.style.Theme_MyApp_PreferenceScreen; 
} 

Zauważ, że ta metoda jest opatrzone @hide, nie możemy użyć @Override adnotacji, które byłyby normalnie stosowane w tym przypadku; i nie możemy również wywołać metody super.getThemeResId(). Jeśli naprawdę, naprawdę chcą, aby móc warunkowo zmienić i wywołać poprzez do super realizacji jako odwrotu, będziesz musiał użyć odbicie dostać się do metody super implementacja za:

 try { 
      ((Object) this).getClass().getMethod("getThemeResId").invoke(this); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } 
+0

Nie działa ... czy możesz podać pełniejszy przykład? –

+0

Odbicie to prawie zawsze brudne, a nie długoterminowe rozwiązanie. – Ewoks