2010-04-11 76 views
25

大家好,我設置了主題清單文件是這樣的:PreferenceActivity和主題不適用

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

但我不得不在首活動中的問題,主偏好主題顯示正常,但如果我得到一個次要的偏好,主題變得雜亂,它不是白色,因爲它應該是全黑的,並且字體是黑色的,所以你看不到太多,當我開始點擊任何物品時,他們有時會得到不過他們應該是白色的,但很快就會變成黑色。這隻會發生在2.1,在真實的設備和模擬器。在運行1.6的模擬器上測試過,它工作正常。這裏是首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> 

這裏是截圖:

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

任何變通辦法?

+0

不是非常有幫助也許,但我在大多數應用程序中使用燈光主題,但我將偏好設置保留在默認的黑色主題中,因爲它看起來合適,我的觀點是用戶會希望所有應用程序首選項具有相同的樣式。 – 2010-04-11 11:23:24

+0

好主意!謝謝。現在,如果回答是評論,我該如何回答這個問題呢? – 2010-04-11 18:01:43

回答

15

有人剛剛發佈了一個解決辦法,在http://code.google.com/p/android/issues/detail?id=4611

簡而言之,頂級優先選擇屏幕似乎認識到主題,但嵌套的人不行。所以解決方法建議創建嵌套PreferenceScreen頂級PreferenceActivity,然後通過調用的意圖這一新的活動:

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

我沒有到主題應用到任何東西,但應用程序本身。

+5

查看答案中的鏈接,現在有一個更簡單的解決方案,請參閱評論35 – powder366 2013-01-06 19:15:28

+0

還有另一種解決方案比這兩種解決方法都更容易;看到我的答案http://stackoverflow.com/a/25613182/231078。 – Joe 2014-09-01 21:40:37

+0

不是真的@Joe – Ewoks 2015-12-01 15:05:43

3

最後我找到了如何更改「PreferenceActivity」的主題編程(通過java代碼)

更改主題只是這樣做:

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

super.onCreate(savedInstanceState);方法總是調用setTheme(R.style.yourtheme);方法。通過這樣做會產生如下所示的結果。

enter image description here

就這樣。

如果您通過super.onCreate(savedInstanceState);方法調用setTheme(R.style.yourtheme);方法,它將產生如下所示的結果。

enter image description here

注:主題不被嵌套PreferenceScreen認識。要將主題應用於該嵌套的PreferenceScreen,您必須爲該嵌套的PreferenceScreen製作另一個PreferenceActivity,並在該處調用setTheme(R.style.yourtheme);方法。

+0

這應該已經upvoted更多。 – faraday 2014-07-20 21:43:38

+0

是的,我同意!我可以證實它的工作原理,這是最簡單的解決方案! – 2014-09-06 10:47:07

4

您也可以使用這種技術來覆蓋樣式的內部優先選擇屏幕的:

本規範適用的主要偏好屏幕的風格所點擊的偏好屏幕。

+0

謝謝! ...這個解決方案爲我工作。 – user836026 2013-09-19 06:30:04

+0

不客氣! :) – webmaster 2013-09-20 16:05:26

+0

這解決了我的問題,絲綢般光滑!謝謝! – aveschini 2014-06-25 14:21:24

0

還有一個更簡單的解決方案,如果你可以使用看起來像黑魔法的東西來完成這個...

查看PreferenceScreen#showDialog(Bundle)的來源,我們看到該對話框是使用通過mContext.getThemeResId()獲得的主題資源創建的,然後將其用於ContextThemeWrapper

這可以幫助我們顯着,因爲在PreferenceScreen正在使用的Context實際上是我們PreferenceActivity,所以我們要做的就是重寫getThemeResId()方法(這是從公共API隱藏),爲我們的自定義主題,並且子PreferenceScreen現在使用我們想要的任何自定義主題資源!

/** 
* 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; 
} 

注意,因爲這種方法與@hide註釋,我們不能使用@Override註解,通常會在這種情況下使用;我們也不能撥打super.getThemeResId()方法。如果你真的,真的希望能夠有條件地忽略這一點,並通過調用超級實現作爲備用,你將不得不使用反射來獲取到超級實現的方法:

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

不起作用...你能提供一個更完整的例子嗎? – 2015-06-03 15:42:47

+0

反思幾乎總是骯髒而不是長期的解決方案。 – Ewoks 2015-12-01 15:05:29