简体   繁体   English

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

[英]save android theme using shared preferences

Hello I am trying to save a theme with shared preferences.您好,我正在尝试使用共享首选项保存主题。 When the user clicks a button with a certain theme I want that theme to be set as default and saved so when they reopen the app its still that new theme.当用户单击具有特定主题的按钮时,我希望将该主题设置为默认主题并保存,以便当他们重新打开应用程序时,它仍然是新主题。

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

Utils:用途:

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;

I also want the theme to be saved for all activities not just the one where the button is clicked.我还希望为所有活动保存主题,而不仅仅是单击按钮的活动。 Thanks谢谢

Here you can find a tutorial about SharedPreferences , basically you should store the number of the selected theme and when the app starts, check which one is stored on SharedPreferences.在这里你可以找到关于SharedPreferences的教程,基本上你应该存储所选主题的编号,当应用程序启动时,检查哪个存储在 SharedPreferences 上。 After retrieving the value you could "store" it globally to check the theme number on other activities (this way, you don't have to check SharedPreferences every time, just when the app starts).检索值后,您可以全局“存储”它以检查其他活动的主题编号(这样,您不必每次都检查 SharedPreferences,只需在应用程序启动时检查)。

UPDATE 0更新 0

Here a class that handles SharedPreference stuff:这是一个处理 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.

Using this class you can store and retrieve diferent type of values on/from SharedPreferences.使用此类,您可以在 SharedPreferences 上/从 SharedPreferences 存储和检索不同类型的值。 In your case, you'll need to store the value of a theme.在您的情况下,您需要存储主题的值。 You have:你有:

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

So, after the user choose a theme you should call:因此,在用户选择主题后,您应该调用:

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

You could call this function on your onClick() handler, or where you think it's better :)您可以在onClick()处理程序或您认为更好的地方调用此函数:)

To retrieve which theme value is stored, call the below code on your onCreate method:要检索存储的主题值,请在 onCreate 方法上调用以下代码:

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

Remember that when you want to retrieve a value from the SharedPreferences, will have to pass the default value, so if nothing related to the tag "theme" is stored, it will return the default value.请记住,当您想从 SharedPreferences 检索值时,必须传递默认值,因此如果没有存储与标签“主题”相关的任何内容,它将返回默认值。

I didn't test this code, maybe you'll have to adpat it a little.我没有测试这段代码,也许你需要稍微调整一下。

In your Main Activity, make these changes to the onClick:在您的主活动中,对 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;
    }
}

Then, at the top in your onCreate, add this prior to super and setContentView:然后,在 onCreate 的顶部,在 super 和 setContentView 之前添加:

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

What we did here was:我们在这里做的是:

  1. Opened and stored the integers relating to the themes in SharedPreferences.在 SharedPreferences 中打开并存储与主题相关的整数。
  2. Opened the SharedPreferences in your onCreate, then called SetTheme to look for the integer saved in the SharedPreferences and apply it to the theme.在 onCreate 中打开 SharedPreferences,然后调用 SetTheme 查找 SharedPreferences 中保存的整数并将其应用于主题。

Now when you click the button for white theme button, it will apply it.现在,当您单击白色主题按钮的按钮时,它将应用它。

I've included an example that should work for you.我已经包含了一个应该对你有用的例子。 See http://developer.android.com/guide/topics/data/data-storage.html#pref for more info.有关详细信息,请参阅http://developer.android.com/guide/topics/data/data-storage.html#pref Since PREFS_NAME is public you can call getSharedPreferences(MyActivity.PREFS_NAME,0);由于 PREFS_NAME 是公开的,您可以调用 getSharedPreferences(MyActivity.PREFS_NAME,0); from other activities to access the same SharedPreferences从其他活动访问相同的 SharedPreferences

Field in your class您班级中的字段

public static final String PREFS_NAME = "MyPrefsFile";

put this code where you want to save the theme choice in SharedPreferences将此代码放在要在 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();

And put this code where you want want to get that value back并将此代码放在您想要取回该值的位置

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM