0

共有設定を使用してトグルボタンのステータスを保存しています。トグルボタンがチェックされている場合は「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

値が正しく読み戻されるまでに時間がかかることがあるという漠然とした記憶があります。値をカプセル化して変数に格納し、そこから値を取得することで、これを解決できます。UIスレッドを中断しないため、apply()代わりに使用することも検討する必要があります。commit()したがって、私は次のようなものを提案します。

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 に答える
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 に答える