我正在尝试实现一个自定义CheckBoxPreference
- 其中,如果用户点击实际的复选框,它会切换状态,但如果他们点击名称,则会打开一个首选项片段。为此,我已经覆盖了OnBindView(View view)
方法,删除了view
的Click侦听器,并尝试将OnClickListener
分别添加到每个子视图中。但是,绑定到OnClickListener
的Android.Support.V7.Widget.AppCompatCheckBox
不会更新复选框的可见状态,即使首选项本身已成功保存
protected override void OnBindView(View view)
{
base.OnBindView(view);
view.Clickable = false;
ViewGroup vg = (ViewGroup)view;
for (int i = 0; i < vg.ChildCount - 1; i++)
{
vg.GetChildAt(i).SetOnClickListener(new DoOpenFragment(this));
}
vg.GetChildAt(vg.ChildCount - 1).SetOnClickListener(new DoCheckBoxClick(this));
}
private class DoCheckBoxClick : Java.Lang.Object, View.IOnClickListener
{
private OpenFragmentCheckboxPreference Pref;
public DoCheckBoxClick(OpenFragmentCheckboxPreference pref)
{
Pref = pref;
}
public void OnClick(View v)
{
var b0 = Pref.GetPersistedBoolean(true);
Pref.PersistBoolean(!b0);
var cb = ((v as ViewGroup).GetChildAt(0) as Android.Support.V7.Widget.AppCompatCheckBox);
var b1 = Pref.GetPersistedBoolean(true);
cb.Checked = b1;
Pref.NotifyChanged();
cb.Invalidate();
}
}
如您所见,我尝试使用Preference的NotifyChanged
方法和实际的CheckBox小部件的Invalidate
方法,但都不起作用。 (额外的,不必要的变量仅用于调试)。任何想法,我可能会错过什么调用,实际上会导致重新绘制复选框并显示其正确的状态?谢谢!
想出来 - 我本来应该在CheckBox.Checked
设置OnBindView
,而不是在OnClick
听众:
protected override void OnBindView(View view)
{
base.OnBindView(view);
view.Clickable = false;
for (int i = 0; i < vg.ChildCount - 1; i++)
{
vg.GetChildAt(i).SetOnClickListener(new DoOpenFragment(this));
}
((vg.GetChildAt(vg.ChildCount - 1) as ViewGroup).GetChildAt(0) as Android.Support.V7.Widget.AppCompatCheckBox).Checked = GetPersistedBoolean(true);
vg.GetChildAt(vg.ChildCount - 1).SetOnClickListener(new DoCheckBoxClick(this));
}
private class DoCheckBoxClick : Java.Lang.Object, View.IOnClickListener
{
private OpenFragmentCheckboxPreference Pref;
public DoCheckBoxClick(OpenFragmentCheckboxPreference pref)
{
Pref = pref;
}
public void OnClick(View v)
{
var b0 = Pref.GetPersistedBoolean(true);
Pref.PersistBoolean(!b0);
Pref.NotifyChanged();
}
}