0

我想在用户sharedPreferences每次点击“保存”按钮时保存用户对主题的选择,但有些事情我显然做错了,但我看不到。

我的问题是,如果没有这些sharedPreferences东西,我的应用程序会按照我想要的方式更改主题,并且没有问题。但是当我应用这些sharedPreferences东西时,它会停止改变主题,而且它也没有保存。

我发表了一些评论,以帮助理解我想要完成什么以及在哪里完成。

这是我的设置类:

public class SettingsActivity extends Activity implements OnClickListener {

public static final String PREF_NAME = "MyPrefsFile";
public static int newTheme;
public final static int THEME_DARK = R.style.DarkTheme;
public final static int THEME_LIGHT = R.style.LightTheme;
public final static int THEME_COLORS = R.style.ColorsTheme;


@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // Here is where I'm supposed to check the sharedPreferences then
    // Set the theme option newTheme with the users last choice, 
            // and if there is
    // a choice set the theme.
    SharedPreferences settings = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
    newTheme = settings.getInt("themeCustom", 0);   

     if(newTheme == THEME_DARK) {
        setTheme(R.style.DarkTheme);

    } else if(newTheme == THEME_LIGHT){
        setTheme(R.style.LightTheme);
    } else if(newTheme == THEME_COLORS) {
        setTheme(R.style.ColorsTheme);
    } else { 
    // Utils.onActivityCreateSetTheme(this);
        setTheme(R.style.AppTheme);
     }
    setContentView(R.layout.activity_settings);

    findViewById(R.id.button2).setOnClickListener(this);
    findViewById(R.id.button3).setOnClickListener(this);
    findViewById(R.id.button4).setOnClickListener(this);
    findViewById(R.id.button5).setOnClickListener(this);
    findViewById(R.id.button6).setOnClickListener(this);
}   
@Override
public void onClick(View v) {
    Intent intent = getIntent();
    Intent main = new Intent(SettingsActivity.this,MainActivity.class);
    switch (v.getId()) {
    case R.id.button2:
        newTheme = THEME_DARK;
        finish();
        startActivity(intent);
        break;

    case R.id.button3:
        newTheme = THEME_LIGHT;
        finish();
        startActivity(intent);
        break;
    case R.id.button5:
        newTheme = THEME_COLORS;
        finish();
        startActivity(intent);
        break;

    case R.id.button4:
        // This button returns to the main activity without saving.
        startActivity(main);
        break;
    case R.id.button6:
        // this is the button save
        SharedPreferences settings = 
                               getSharedPreferences(PREF_NAME, MODE_PRIVATE);
        SharedPreferences.Editor edit;
        edit = settings.edit();
        edit.clear();
        edit.putInt("themeCustom", newTheme);
        edit.commit();
        startActivity(main);
        break;

    default:
        break;
        }

    }

    }
4

4 回答 4

1

我认为您没有保存更改。每次单击主题更改按钮时,您只需为newTheme标记分配一个新的主题值,然后您finish()就是活动。但是您在完成活动之前将更改保存在哪里?

您应该在完成活动之前提交新的更改,然后我认为它将反映这些更改。

于 2013-05-01T05:52:00.240 回答
1

我认为这是因为您在一个 SharedPreferencec.Editor 事务中调用 clear 和 putInt 。 http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#clear()

不调用 clear,只调用 putInt

于 2013-05-01T05:45:20.417 回答
0

问题在于这里的 int 和 long 。

这里 newTheme 是 int 并且它存储 THEME_DARK 或 THEME_ILGHT 等等。但 THEME_DARK 和其他变量具有长值,即 R.style.DarkTheme 可以是长值或十六进制值。

所以最终当你将这些 newTheme 保存在 sharedPref 中时,你实际上只保存了 0 。

您可以在将 newTheme 变量写入 Shared Pref 之前检查它的值。这将清除您的问题。

为了解决这个问题,您可以为这些主题使用任何其他最终整数值,并让它们保存到共享首选项中。

希望这能解决您的问题。

于 2013-05-01T05:51:33.207 回答
0

要保存您的共享首选项,您可以使用以下代码:

SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor prefEditor = prefs.edit();
prefEditor.putInt(“themeCustom”, 0); 
prefEditor.commit();
于 2013-05-01T08:47:55.800 回答