共享首选项不保存数据

时间:2012-09-13 12:42:06

标签: android sharedpreferences

我使用sharedpreffrence存储togglebutton的状态。 如果选中切换按钮,则按“ON”,如果未选中切换按钮,则按“OFF”。 但是当我恢复状态时,它总是返回“ON” 这是代码

SharedPreferences.Editor  shfEditMessageSMS;
SharedPreferences  shfResponderMessage;
shfResponderMessage=getSharedPreferences("MESSAGE", Context.MODE_PRIVATE);
shfEditMessageSMS=shfResponderMessage.edit();

toggleStatus=(ToggleButton)findViewById(R.id.toggleButtonStatus);

toggleStatus.setOnClickListener(new View.OnClickListener()
{           
    public void onClick(View v)
    {
        // TODO Auto-generated method stub
        if(((ToggleButton)v).isChecked())
        {
            shfEditMessageSMS.putString("SMSRESPONDERONOFF", "ON");
            shfEditMessageSMS.commit();

            showNotification("ON");                   
        }
        else
        {
            shfEditMessageSMS=shfResponderMessage.edit();
            shfEditMessageSMS.putString("SMSRESPONDERONOFF", "OFF");
            shfEditMessageSMS.commit();

            showNotification("OFF");
            String SMSResponderOnOrOff=shfResponderMessage.getString("SMSRESPONDERONOFF", "NONE");
            Log.i("SMS Responder on click "+SMSResponderOnOrOff," "); 
        }
    }
});

正如您在代码中看到的那样,如果未选中切换按钮我正在做

shfEditMessageSMS.putString("SMSRESPONDERONOFF", "OFF");
shfEditMessageSMS.commit();

但是当我使用日志

检索和打印时
String SMSResponderOnOrOff=shfResponderMessage.getString("SMSRESPONDERONOFF", "NONE");
Log.i("SMS Responder on click "+SMSResponderOnOrOff," ");

它总是在日志中显示“ON”。

可能是什么问题。 感谢。

3 个答案:

答案 0 :(得分:1)

我在我的应用程序中实现了相同的功能。可能会帮助你解决你的问题。虽然无法找出你在你的代码中所犯的错误。参考下面的代码。

boolean on; 
 public SharedPreferences spref; 
  final String PREF_NAME="preferences"; 
 ToggleButton tb;

@Override protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fb_intermidiate);
    spref = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
    tb = (ToggleButton) findViewById(R.id.toggleButton1);
    on = spref.getBoolean("On", true);  //default is true
    if (on = true) 
    {
      tb.setChecked(true);
    }       else
    {
      tb.setChecked(false);
    }
    back = (Button)findViewById(R.id.button_back); 
    //back.setText(R.string.back_button_in_settings);
    back.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            finish();
        }
    });  } 

public void onToggleClicked(View view) {

    on = ((ToggleButton) view).isChecked();
    if (on) {
        Toast.makeText(this, "On : Notification will be Enabled", Toast.LENGTH_SHORT).show();
        SharedPreferences.Editor editor = spref.edit();
        editor.putBoolean("On", true); // value to store
        editor.commit();

    } else {
    Toast.makeText(this, "Off : Notification will be Disabled", Toast.LENGTH_SHORT).show();
        SharedPreferences.Editor editor =spref.edit();
        editor.putBoolean("On", false); // value to store
        editor.commit();
    }   }

答案 1 :(得分:0)

我遇到了类似的问题,但保存了一个String数组。我通过在每次保存时递增变量来“解决”问题。

    public void saveProfileList(Context context) {
            SharedPreferences sharedprefs = context.getSharedPreferences(PREFS_NAME,Activity.MODE_PRIVATE);
            Editor editor = sharedprefs.edit();
            editor.putStringSet("vpnlist", profiles.keySet());

            // For reasing I do not understand at all 
            // Android saves my prefs file only one time 
            // if I remove the debug code below :(
            int counter = sharedprefs.getInt("counter", 0);
            editor.putInt("counter", counter+1);
            editor.apply();


    }

在Android代码中某处似乎存在一个错误,它并不总是将共享偏好检测为已更改。

答案 2 :(得分:0)

我有一个模糊的回忆,它可能需要一段时间才能正确读回值。您可以通过封装值并将其存储在变量中来解决这个问题,您也可以从变量中检索它。您还应该考虑使用apply()而不是commit(),因为它不会中断UI线程。因此,我建议如下:

public class Preferences {
    private SharedPreferences mPrefs;
    private static final String KEY = "SMSRESPONDERONOFF";
    private String mValue;

    public Preferences(SharedPreferences prefs) {
        mPrefs = prefs;
    }

    public String getValue() {
        if (mValue == null) {
            mValue = mPrefs.getString(KEY, "NONE");
        }

        return mValue;
    }

    public void setValue(String value) {
        mValue = value;
        mPrefs.edit().putString(KEY, value).apply();
    }
}