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

时间:2015-03-18 01:37:07

标签: android themes sharedpreferences

您好我正在尝试使用共享首选项保存主题。当用户点击具有特定主题的按钮时,我希望将该主题设置为默认并保存,以便当他们重新打开应用程序时仍然是该新主题。

主要活动:

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

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

3 个答案:

答案 0 :(得分:2)

在您的主要活动中,对onClick进行以下更改:

/var/www/www.example.com/src/media/

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

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

我们在这里做的是:

  1. 在SharedPreferences中打开并存储与主题相关的整数。
  2. 打开onCreate中的SharedPreferences,然后调用SetTheme以查找SharedPreferences中保存的整数并将其应用于主题。
  3. 现在,当您单击白色主题按钮的按钮时,它将应用它。

答案 1 :(得分:0)

我已经包含了一个适合您的示例。有关详细信息,请参阅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);

答案 2 :(得分:0)

在这里你可以找到关于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中检索值时,必须传递默认值,因此如果没有任何与标记"主题相关的内容"存储后,它将返回默认值。

我没有测试过这段代码,也许你不得不稍微调试一下。