Android 自定义首选项中的复选框未更新
Android Checkbox in Custom Preference not updating
我正在尝试实现自定义 CheckBoxPreference
- 如果用户单击实际的复选框,它会切换状态,但如果他们单击名称,则会打开一个首选项片段。为此,我覆盖了 OnBindView(View view)
方法,删除了 view
的 Click 侦听器,并尝试将 OnClickListener
分别添加到其每个子视图。但是,绑定到 Android.Support.V7.Widget.AppCompatCheckBox
的 OnClickListener
不会更新复选框的可见状态,即使首选项本身已成功保存
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
方法,但均无效。 (额外的、不必要的变量只是为了调试)。知道我可能会错过什么调用实际上会导致重新绘制复选框并显示其正确状态吗?谢谢!
明白了 - 我应该在 OnBindView
中设置 CheckBox.Checked
,而不是在 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();
}
}
我正在尝试实现自定义 CheckBoxPreference
- 如果用户单击实际的复选框,它会切换状态,但如果他们单击名称,则会打开一个首选项片段。为此,我覆盖了 OnBindView(View view)
方法,删除了 view
的 Click 侦听器,并尝试将 OnClickListener
分别添加到其每个子视图。但是,绑定到 Android.Support.V7.Widget.AppCompatCheckBox
的 OnClickListener
不会更新复选框的可见状态,即使首选项本身已成功保存
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
方法,但均无效。 (额外的、不必要的变量只是为了调试)。知道我可能会错过什么调用实际上会导致重新绘制复选框并显示其正确状态吗?谢谢!
明白了 - 我应该在 OnBindView
中设置 CheckBox.Checked
,而不是在 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();
}
}