3

我一直在尝试让我的应用程序从首选项中读取数据,并根据所选选项更改主题。我在互联网上找到了许多不同的建议,包括这里,但一直无法让它发挥作用。

我创建了preferences.xml 和arrays.xml,用户可以选择他们想要的主题。但是,更改并未反映在应用程序中。

以下是 ActivityMain.java 的内容:

public class MainActivity extends Activity {

 protected void onCreate(Bundle savedInstanceState) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    String userTheme = preferences.getString("prefTheme", "darkab"); 
    if (userTheme.equals("darkab"))
        setTheme(R.style.darkab);
    else if (userTheme.equals("light"))
        setTheme(R.style.light);
    else if (userTheme.equals("dark"))
        setTheme(R.style.dark);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@SuppressLint("NewApi")
protected void onResume(Bundle savedInstanceState) {
    recreate();
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    String userTheme = preferences.getString("prefTheme", "darkab");
    if (userTheme.equals("darkab"))
        setTheme(R.style.darkab);
    else if (userTheme.equals("light"))
        setTheme(R.style.light);
    else {setTheme(R.style.dark);}
    super.onResume();
    setContentView(R.layout.activity_main);
}

这些是我希望使用的样式,在 styles.xml 中设置:

<style name="darkab" parent="android:Theme.Holo.Light.DarkActionBar"></style>
<style name="light" parent="android:Theme.Holo.Light"></style>
<style name="dark" parent="android:Theme.Holo">

这是我的preferences.java 文件:

public class Preferences extends PreferenceActivity {
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
}

任何帮助,将不胜感激。

4

2 回答 2

4

setTheme()仅在布局构建之前有效,即您应该在之前调用它setContentView()LayoutInflater解析主题属性并相应地在它创建的 's 上设置属性View。要在已运行的 Activity 上应用主题,您必须重新启动 Activity。

于 2013-02-22T13:37:36.373 回答
-1

我知道我迟到了,但我想在这里发布一个解决方案:在此处
查看完整的源代码
这是我使用首选项更改主题时使用的代码..

SharedPreferences pref = PreferenceManager
            .getDefaultSharedPreferences(this);
String themeName = pref.getString("prefSyncFrequency3", "Theme1");
if (themeName.equals("Africa")) {
    setTheme(R.style.AppTheme);
} else if (themeName.equals("Colorful Beach")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.beach);
} else if (themeName.equals("Abstract")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.abstract2);
} else if (themeName.equals("Default")) {
    setTheme(R.style.defaulttheme);
}

请注意,您必须将代码放在 setcontentview 之前。

于 2015-10-23T14:44:51.567 回答