Я сделал простое расширение CheckBoxPreference
, чтобы у меня мог быть собственный настраиваемый вид со значком изображения слева от заголовка. Код ниже:
public class CustomCheckBoxPreference extends CheckBoxPreference {
private Drawable icon;
public CustomCheckBoxPreference(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.CustomCheckBoxPreference, 0, 0);
icon = arr.getDrawable(R.styleable.CustomCheckBoxPreference_icon);
setLayoutResource(R.layout.custom_checkbox_pref);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
ImageView prefsIcon = (ImageView) view.findViewById(R.id.prefs_icon);
prefsIcon.setImageDrawable(icon);
}
Проблема в том, что по какой-то причине OnPreferenceChangeListener
I, установленный на любое значение CustomCheckboxPreference
, не имеет никакого эффекта и не сохраняется. Я попытался переопределить некоторые из методов Android для реализации, вызвав super, а затем распечатав строку, чтобы увидеть, что вызывается. Примечательно, что callChangeListener
не вызывают. Именно этот метод приводит к обратному вызову для onPreferenceChanged
. Я попытался вызвать onPreferenceChanged
внутри setChecked, чтобы посмотреть, что произойдет, и OnPreferenceChangeListener
будет нулевым:
getOnPreferenceChangeListener().onPreferenceChange(this, checked);
Вот как я устанавливаю preferencechangelistener:
mTwitterPref.setChecked(!mTwitter.needsAuth());
mTwitterPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
System.out.println("Twitter Preference Changed!");
if ((Boolean) newValue) {
if (mTwitter.needsAuth()) {
System.out.println("We Need To Login To Twitter!");
IntentUtils.startActivityForResult(ProfileAccountsActivity.this,
TwLoginActivity.class, ACTIVITY_OAUTH);
}
} else {
showDialog(DIALOG_LOGOUT_TWITTER);
}
return false;
}
});
Я немного смущен тем, почему preferencechangelistener
не работает должным образом, поскольку я перезаписываю только onBindView
и конструктор; Я называю супер в обоих. Есть мысли?