0

this might seems a often-asked question, but I still cannot get through, using very method proposed on Stack Overflow. I have a preference.xml as below:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <CheckBoxPreference
        android:defaultValue="true"
        android:key="isBlock"
        android:layout="@layout/custom_checkbox_layout"
        android:summaryOff="Let strange calls in"
        android:summaryOn="Unlisted calls will be blocked"
        android:title="Block Strange Calls" />
.....

And I want to get the change of the state of the checkbox in my code. So my Java codes are posted below:

public class Prefs extends PreferenceActivity implements OnSharedPreferenceChangeListener {

public static boolean blockOrNot;
private MySharedPreference mySharedPreference;

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preference);
    setContentView(R.layout.custom_preference_layout);

    ImageButton save = (ImageButton) findViewById(R.id.save_prefs);
    save.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (blockOrNot) {
                Toast.makeText(Prefs.this, "Saved! " + blockOrNot, Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(Prefs.this, "Saved! " + blockOrNot, Toast.LENGTH_LONG).show();
            }
        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    blockOrNot = sp.getBoolean("isBlock", false);
}

@Override
protected void onPause() {
    super.onPause();
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    // TODO Auto-generated method stub
    if (key.equals("isBlock")) {
        blockOrNot = sharedPreferences.getBoolean(key, false);
    }
}

}

But whenever I press the button, I can only get "true", which is the original value of the checkbox, thought I unchecked it. I search this issue, and tried one way on SOF before, like below:

public class Prefs extends PreferenceActivity implements OnSharedPreferenceChangeListener {

    public static boolean blockOrNot;
    private MySharedPreference mySharedPreference;

    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preference);
        setContentView(R.layout.custom_preference_layout);

        ImageButton save = (ImageButton) findViewById(R.id.save_prefs);
        save.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (blockOrNot) {
                    Toast.makeText(Prefs.this, "Saved! " + blockOrNot, Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(Prefs.this, "Saved! " + blockOrNot, Toast.LENGTH_LONG).show();
                }
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Unregister the listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, final String key) {
        // TODO Auto-generated method stub
        CheckBoxPreference checkboxPref = (CheckBoxPreference) getPreferenceManager().findPreference(key);
        checkboxPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                if (key.equals("isBlock")) {
                    blockOrNot = (Boolean) newValue;
                }
                return true;
            }
        });
    }
}

But still nothing changed. Could anyone please give some advice? Thanks to all!!

Yuchun Cui
  • 69
  • 2
  • 7
  • Why are you setting an setOnPreferenceChangeListener in an setOnPreferenceChangeListener..... ? You should remove that and just leave your if (key.equals("isBlock")) statement – dymmeh Oct 15 '13 at 21:31
  • Thanks for answering @dymmeh but I tried in the first paragraph of codes, they didn't work. The weird way you said was from other's solution.. but NEITHER of them worked.. – Yuchun Cui Oct 15 '13 at 21:35

0 Answers0