0

我正在使用 sharedpreffrence 存储切换按钮的状态。如果选中切换按钮,我将设置为“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”。

可能是什么问题呢。谢谢。

4

3 回答 3

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();
    }   }
于 2012-09-13T13:19:42.800 回答
0

我有一个类似的问题,但保存一个字符串数组。我通过在每次保存时增加一个变量来“解决”这个问题。

    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 代码中的某处似乎存在一个错误,它并不总是检测到 sharedpreferences 已更改。

于 2012-09-13T12:48:28.693 回答
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();
    }
}
于 2012-09-13T13:36:57.400 回答