我正在尝试在我的应用中更改PreferenceActivity的主题,但我无法让它工作。
这是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>
这就是PreferenceActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setTheme(R.style.AppTheme);
addPreferencesFromResource(R.xml.preferences);
}
结果是:
答案 0 :(得分:18)
您是否尝试在清单中的活动代码上应用主题?这就是我以前做过的事情 -
<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>
编辑:
您可以尝试的另一个选项是覆盖onApplyThemeResource(Resources.Theme theme, int resid, boolean first)
。查看android源代码,setTheme将在内部调用方法。
/**
* 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);
}
答案 1 :(得分:10)
最后我发现如何以编程方式更改主题“PreferenceActivity”(通过java代码)
改变主题只需这样:
@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);
方法,则会产生如下所示的结果。
注意:嵌套的PreferenceScreen无法识别主题。要将主题应用于嵌套的PreferenceScreen,您必须为该嵌套的PreferenceScreen制作另一个PreferenceActivity,并在那里调用setTheme(R.style.yourtheme);
方法。
答案 2 :(得分:4)
如果您想更改背景,可以使用
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);
.......
}
}
答案 3 :(得分:0)
我个人使用这种方法: 对于低于11的API,我使用(values directory,themes.xml文件):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="@android:style/Theme.Light.NoTitleBar"></style>
</resources>
表示更高版本(例如values-v14目录,themes.xml文件):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="@android:style/Theme.Holo.Light.NoActionBar"></style>
</resources>
和清单:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
Android将自动选择基于设备API的主题,无需在活动(清单)中指定任何主题或在代码中指定语法......
答案 4 :(得分:0)
这听起来很愚蠢,但使用setTheme()
会对你的所有片段起作用,但不会影响主要的偏好活动。在清单文件中设置它,它将突然开始工作。
我根据用户偏好动态设置主题,在主题管理器对象setTheme()
之前调用onCreate
(它还会发出可以通过主题更改的各种颜色和drawables
我不想设置风格......主要是因为它太混乱而无法弄清楚什么是什么)。
不知道为什么在清单中设置它会使setTheme()
有效。我猜想只是一些特定于偏好活动的故障。