Android 首选项活动和主题不适用
嗨,我在清单文件中设置了如下主题:Android 首选项活动和主题不适用,android,themes,android-preferences,Android,Themes,Android Preferences,嗨,我在清单文件中设置了如下主题: android:theme="@android:style/Theme.Light" @Override public void onCreate(Bundle savedInstanceState) { setTheme(R.style.Holo_Theme_Light); super.onCreate(savedInstanceState); } 但是我在Preferenc
android:theme="@android:style/Theme.Light"
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.Holo_Theme_Light);
super.onCreate(savedInstanceState);
}
但是我在Preferences活动中遇到了一个问题,在主首选项中主题显示ok,但是如果我进入子首选项,主题会变得混乱,它不是应该的白色,它是黑色的,字体是黑色的,所以你看不到太多,当我开始点击任何项目时,它们有时会变为白色,但很快就会变为黑色。这只发生在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>
下面是一个屏幕截图:
有什么解决办法吗?这似乎是个bug。请参见有人刚刚在 简言之,顶级首选项屏幕似乎能识别主题,但嵌套屏幕却不能识别。因此,解决方案建议为嵌套的PreferenceScreen创建顶级PreferenceActivity,然后通过intent调用此新活动:
<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>
除了应用程序本身,我不必将主题应用于任何东西。最后我发现了如何以编程方式(通过java代码)更改“PreferenceActivity”的主题 要更改主题,请执行以下操作:
android:theme="@android:style/Theme.Light"
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.Holo_Theme_Light);
super.onCreate(savedInstanceState);
}
始终调用setTheme(R.style.yourtheme)
super.onCreate(savedInstanceState)之前的方法代码>方法。这样做将产生如下所示的结果
就这些
如果你调用setTheme(R.style.yourtheme)super.onCreate(savedInstanceState)之后的code>method代码>方法它将产生如下所示的结果
注意:嵌套首选项屏幕无法识别主题。要将主题应用于该嵌套首选项屏幕,您必须为该嵌套首选项屏幕创建另一个首选项活动,并调用setTheme(R.style.yourtheme)代码>方法。您还可以使用此技术覆盖内部首选项屏幕的样式:
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
super.onPreferenceTreeClick(preferenceScreen, preference);
if (preference != null) {
if (preference instanceof PreferenceScreen) {
if (((PreferenceScreen) preference).getDialog() != null) {
((PreferenceScreen) preference)
.getDialog()
.getWindow()
.getDecorView()
.setBackgroundDrawable(
this
.getWindow()
.getDecorView()
.getBackground()
.getConstantState()
.newDrawable()
);
}
}
}
return false;
}
此代码将主首选项屏幕的样式应用于单击的首选项屏幕。如果您愿意使用看似黑魔法的方法来完成此操作,则有一个更简单的解决方案
查看的源代码,我们看到该对话框是使用通过mContext.getThemeResId()
获得的主题资源创建的,该主题资源随后用于ContextThemeWrapper
这对我们有很大帮助,因为首选项屏幕中使用的上下文
实际上是我们的首选项活动
,所以我们所要做的就是重写getThemeResId()
方法(该方法在公共API中隐藏),以提供我们的自定义主题,子首选项屏幕现在使用我们想要的任何自定义主题资源
/**
* 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();
}
可能不是很有帮助,但我在我的大多数应用程序中使用灯光主题,但我将首选项保留在默认的黑色主题中,因为这似乎是合适的,我的观点是,用户希望所有应用程序首选项都具有相同的样式。好主意!谢谢现在,如果答案是注释,我如何标记回答的问题?检查答案中的链接,现在有一个更简单的解决方案,请参见注释35还有一个解决方案比这两个解决方案都更简单;看看我的答案。是的,我同意!我可以确认它的工作,这是最简单的解决方案!不起作用。。。你能提供一个更完整的例子吗?反射几乎总是肮脏的,而不是长期的解决方案。