使用共享首选项保存 android 主题

save android theme using shared preferences

您好,我正在尝试保存具有共享偏好的主题。当用户单击具有特定主题的按钮时,我希望将该主题设置为默认主题并保存,这样当他们重新打开应用程序时,它仍然是那个新主题。

主要Activity:

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Utils.onActivityCreateSetTheme(this);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this);


    }
    @Override
    public void onClick(View v)
    {
        switch (v.getId())
        {
            case R.id.button1:
                Utils.changeToTheme(this, Utils.THEME_DEFAULT);
                break;
            case R.id.button2:
                Utils.changeToTheme(this, Utils.THEME_WHITE);
                break;
            case R.id.button3:
                Utils.changeToTheme(this, Utils.THEME_BLUE);
                break;
        }
    }
}

实用程序:

public class Utils{
private static int sTheme;
public final static int THEME_DEFAULT = 0;
public final static int THEME_WHITE = 1;
public final static int THEME_BLUE = 2;
/**
 * Set the theme of the Activity, and restart it by creating a new Activity of the same type.
 */
public static void changeToTheme(Activity activity, int theme)
{
    sTheme = theme;
    activity.finish();
    activity.startActivity(new Intent(activity, activity.getClass()));
}
/** Set the theme of the activity, according to the configuration.
 * @param activity*/
public static void onActivityCreateSetTheme(MainActivity activity)
{
    switch (sTheme)
    {
        default:
        case THEME_DEFAULT:
            activity.setTheme(R.style.AppTheme);
            break;
        case THEME_WHITE:
            activity.setTheme(R.style.MyTheme);
            break;
        case THEME_BLUE:
            activity.setTheme(R.style.My2Theme);
            break;

我还希望为所有活动保存主题,而不仅仅是单击按钮的活动。谢谢

我提供了一个应该适合您的示例。有关详细信息,请参阅 http://developer.android.com/guide/topics/data/data-storage.html#pref。由于 PREFS_NAME 是 public 您可以调用 getSharedPreferences(MyActivity.PREFS_NAME,0);从其他活动访问相同的 SharedPreferences

您的字段 class

public static final String PREFS_NAME = "MyPrefsFile";

将此代码放在您要在 SharedPreferences 中保存主题选择的位置

  SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
  SharedPreferences.Editor editor = settings.edit();
  //"theme" is the key sTheme is the value you're saving
  editor.putInt("theme", sTheme);
  editor.commit();

并将此代码放在您想要取回该值的位置

   SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
   //"theme" is the same key 0 is the default value
   int theme = settings.getInt("theme", 0);

在这里你可以找到关于SharedPreferences 的教程,基本上你应该存储所选主题的编号,当应用程序启动时,检查哪个存储在SharedPreferences中。检索值后,您可以 "store" 全局检查其他活动的主题编号(这样,您不必每次都检查 SharedPreferences,只需在应用程序启动时)。

更新 0

这里有一个 class 处理 SharedPreference 的东西:

public class SharedPreferencesManager {
/**
 * SharedPreferences to store the settings. This way, they'll be available next time the user starts the app
 */
private SharedPreferences sPreferences;
/**
 * Editor to make changes on sharedPreferences
 */
private SharedPreferences.Editor sEditor;

/**
 * The class itself
 */
private Context context;

public SharedPreferencesManager(Context context){
    this.context = context;
    sPreferences = PreferenceManager.getDefaultSharedPreferences(context);
}

private SharedPreferences.Editor getEditor(){
    return sPreferences.edit();
}

/**
 * Store a boolean value in sharedPreferences
 * @param tag identifies the value
 * @param value the value itself
 */

public void storeBoolean(String tag, boolean value){
    sEditor = getEditor();
    sEditor.putBoolean(tag,value);
    sEditor.commit();
}
/**
 * Store a string in sharedPreferences
 * @param tag identifies the value
 * @param str the string itself
 */

public void storeString(String tag, String str){
    sEditor = getEditor();
    sEditor.putString(tag, str);
    sEditor.commit();
}

/**
 *
 * @param tag identifies the value
 * @param defValue default value
 * @return the stored or default value
 */

public boolean retrieveBoolean(String tag, boolean defValue){
    return sPreferences.getBoolean(tag,defValue);

}

/**
 *
 * @param tag identifies the string
 * @param defStr default string
 * @return the stored or default string
 */

public String retrieveString(String tag, String defStr){
    return sPreferences.getString(tag, defStr);
}

/**
 *
 * @param tag identifies the value
 * @param defValue default value
 * @return the stored or default value
 */
public int retrieveInt(String tag, int defValue){
    return sPreferences.getInt(tag, defValue);
}

/**
 *
 * @param tag identifies the value
 * @param defValue the value itself
 */
public void storeInt(String tag, int defValue){
    sEditor = getEditor();
    sEditor.putInt(tag, defValue);
    sEditor.commit();
}
//Incorrect Bracket Closing Removal.

使用此 class 您可以存储和检索不同类型的值 on/from SharedPreferences。在您的情况下,您需要存储主题的价值。你有:

public final static int THEME_DEFAULT = 0;
public final static int THEME_WHITE = 1;
public final static int THEME_BLUE = 2;

因此,在用户选择主题后,您应该调用:

new SharedPreferencesManager(getApplicationContext()).storeInt("theme", THEME_WHITE);

您可以在 onClick() 处理程序上或您认为更好的地方调用此函数:)

要检索存储的主题值,请在 onCreate 方法中调用以下代码:

Utils.changeToTheme(this, new SharedPreferencesManager(this).retrieveInt("theme", THEME_WHITE));

请记住,当您要从 SharedPreferences 中检索值时,必须传递默认值,因此如果没有存储任何与标签 "theme" 相关的内容,它将 return 默认值价值。

我没有测试这段代码,也许你需要稍微调整一下。

在您的 Main Activity 中,对 onClick 进行以下更改:

@Override
public void onClick(View v)
{
    //Setup the SharedPreferences
    SharedPreferences mSettings =  this.getSharedPreferences("Themes", 0);
    //SharedPrerefences Editor (to add content to SP)
    SharedPreferences.Editor editor = mSettings.edit();
    switch (v.getId())
    {
        case R.id.button1:
            Utils.changeToTheme(this, Utils.THEME_DEFAULT);
            //Add the theme's int to SharedPreferences  
            editor.putInt("theme", Utils.THEME_TEAL);
            //Apply the save
            editor.apply();
            break;
        case R.id.button2:
            Utils.changeToTheme(this, Utils.THEME_WHITE);
            //Add the theme's int to SharedPreferences  
            editor.putInt("theme", Utils.THEME_TEAL);
            //Apply the save
            editor.apply();
            break;
        case R.id.button3:
            Utils.changeToTheme(this, Utils.THEME_BLUE);
            //Add the theme's int to SharedPreferences  
            editor.putInt("theme", Utils.THEME_TEAL);
            //Apply the save
            editor.apply();
            break;
    }
}

然后,在 onCreate 的顶部,在 super 和 setContentView 之前添加:

SharedPreferences mSettings = this.getSharedPreferences("Themes", 0);
Utils.SetTheme(mSettings.getInt("theme", 0));

我们在这里所做的是:

  1. 在 SharedPreferences 中打开并存储与主题相关的整数。
  2. 在你的onCreate中打开SharedPreferences,然后调用SetTheme来查找保存在SharedPreferences中的整数并将其应用于主题。

现在当你点击白色主题按钮时,它会应用它。