用户可以更改应用主题

时间:2013-03-16 11:46:59

标签: java android eclipse themes android-actionbar

我希望我的应用程序的用户能够更改应用程序主题。 例如,暗,光,光,暗动作条和设备默认。这怎么可能,我有一个prefrences屏幕,其中有一个listpref,有四个选项(如上所示)。如何让用户更改应用主题?

由于

2 个答案:

答案 0 :(得分:3)

如果您只想使用内置主题并且不需要自定义它们,这很容易。

作为一个例子,我将使用ListPreferece这样的条目值:

<string-array name="pref_theme_values" translatable="false">
    <item>THEME_LIGHT</item>
    <item>THEME_DARK</item>
</string-array>

然后,您可以使用此方法检索所选值:

public int getThemeId(Context context) {
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
    String theme = settings.getString(context.getResources().getString(R.string.pref_theme_key), null);

    if (theme == null || theme.equals("THEME_LIGHT")) {
        return android.R.style.Theme_Holo_Light;
    } else if (theme.equals("THEME_DARK")) {
        return android.R.style.Theme_Holo;
    }

    // default
    return android.R.style.Theme_Holo_Light;
}

之后你应该覆盖onCreate方法:

// onCreate
this.mCurrentTheme = this.getThemeId(this);
this.setTheme(this.mCurrentTheme);
this.setContentView(...); // should be after the setTheme call

onStart方法(因为您需要在用户从settigns页面返回后立即刷新主题)

// onStart
int newTheme = this.getThemeId(this);
if(this.mCurrentTheme != newTheme) {
    this.finish();
    this.startActivity(new Intent(this, this.getClass()));
    return;
}

此外,您需要以某种方式保存活动状态,以便应用程序在重新启动活动后显示相同的数据。

答案 1 :(得分:2)

以下是如何操作的示例;

 if (prefs.getBoolean("1darkTheme", false)==false){//user has selected dark theme
        setTheme(android.R.style.Theme_Holo);
        Toast.makeText(getApplicationContext(), "dark", Toast.LENGTH_SHORT).show();
    } else {
        setTheme(android.R.style.Theme_Holo_Light);
        Toast.makeText(getApplicationContext(), "light", Toast.LENGTH_SHORT).show();
    }
    setContentView(R.layout.main);