2010-04-11 48 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

相关问题