【问题标题】:save android theme using shared preferences使用共享首选项保存 android 主题
【发布时间】:2015-03-18 01:37:07
【问题描述】:

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

主要活动:

/** 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;

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

【问题讨论】:

    标签: android themes sharedpreferences


    【解决方案1】:

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

    更新 0

    这是一个处理 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.
    

    使用这个类,您可以在 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_WHITE 主题谢谢
    【解决方案2】:

    在您的 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 中的整数并将其应用于主题。

    现在,当您单击白色主题按钮的按钮时,它将应用它。

    【讨论】:

      【解决方案3】:

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

      类中的字段

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

      【讨论】:

      • 我认为我没有正确设置它:(你能在我的代码中显示这个例子吗?例如说我正在尝试保存 THEME_WHITE 主题谢谢
      • 我认为这是这个任务最简单的解决方案
      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多