我正在尝试实现自定义CheckBoxPreference
-一种在其中,如果用户单击实际的复选框,它将切换状态,但是,如果用户单击名称,则会打开一个首选项片段。为此,我重写了OnBindView(View view)
方法,删除了view
的Click侦听器,并试图将OnClickListener
分别添加到其每个子视图中。但是,绑定到OnClickListener
的{{1}}不会更新复选框的可见状态,即使首选项本身已成功保存
Android.Support.V7.Widget.AppCompatCheckBox
如您所见,我尝试同时使用Preference的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();
}
}
方法和实际的CheckBox小部件的NotifyChanged
方法,但两者均无效。 (多余的,不必要的变量仅用于调试)。任何想法我可能会丢失的呼叫实际上会导致复选框重新绘制并显示其正确状态吗?谢谢!
答案 0 :(得分:0)
弄清楚了-我应该在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();
}
}