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!!