【发布时间】:2018-02-14 17:58:10
【问题描述】:
我对@987654321@ 做了一个简单的扩展,这样我就可以拥有自己的自定义视图,标题左侧有一个图像图标。代码如下:
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);
}
问题是由于某种原因,我设置为任何CustomCheckboxPreference 的OnPreferenceChangeListener 没有效果并且没有被存储。我尝试为调用 super 的实现覆盖一些 android 方法,然后打印一行以查看调用了什么。值得注意的是 callChangeListener 不会被调用。正是这种方法导致了onPreferenceChanged 的回调。我尝试在 setChecked 内调用onPreferenceChanged 只是为了看看会发生什么,而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 和构造函数;我两个都叫超级。有什么想法吗?
【问题讨论】:
-
您希望在选中复选框时更新首选项?你不需要在你的复选框上设置一个 onCheckChangedListener 吗?
标签: android preferences