2013-02-22 77 views
2

我一直试图让我的应用程序从首选项中读取数据,并根据所选的选项更改主题。我在互联网上发现了许多不同的建议,包括这里,但一直未能得到它的工作。使用偏好更改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); 
} 

任何帮助,将不胜感激。

回答

3

setTheme()仅在之前生效布局已经构建,即您应该在setContentView()之前调用它。 LayoutInflater解决了主题属性,并据此设置了它创建的View的属性。要在已经运行的活动中应用主题,您必须重新启动活动。

+0

setTheme()在setContentView()之前是不是? 要重新启动活动,是否需要将recreate()放在onResume部分中? – 2013-02-22 13:45:12

+0

@CarlAnsell使'setTheme()'成为'onCreate()'中的第一条语句。 http://code.google.com/p/android/issues/detail?id=4394 – 2013-02-22 13:46:33

+0

谢谢,它现在正在工作。但是,它只在按下应用程序后退按钮时才起作用,而不是系统后退按钮。我更新了我在OP中使用的代码。 – 2013-02-22 14:13:08

-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之前放置代码..

+0

请不要在多个问题上发布相同的答案。如果问题重复,则发布最佳问题的答案,并将其他问题标记为最佳问题的副本。如果它们不是重复的,那么你需要调整每一个答案来回答这个具体的问题。此外,请尝试在您的每一个答案中获得格式化权限和[不包括](http://meta.stackexchange.com/q/2950/266187)“快乐编码”。 – 2015-10-24 16:42:24

相关问题