0

我希望我的应用程序的用户能够更改应用程序主题。例如,深色、浅色、浅色,带有深色操作栏和设备默认设置。这怎么可能,我有一个偏好屏幕,里面有一个列表偏好,有四个选项(如上所示)。如何让用户更改应用主题?

谢谢

4

2 回答 2

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;
}

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

于 2013-03-16T12:56:27.717 回答
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);
于 2013-03-16T12:28:08.827 回答