使用首选项更改Android应用程序的主题

时间:2013-02-22 13:28:46

标签: android

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

我创建了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);
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

只有在构建布局之前,

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

答案 1 :(得分:-1)

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

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

之前