自定义首选项中的Android复选框未更新

时间:2019-03-06 03:49:02

标签: android xamarin.android android-widget android-preferences

我正在尝试实现自定义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方法,但两者均无效。 (多余的,不必要的变量仅用于调试)。任何想法我可能会丢失的呼叫实际上会导致复选框重新绘制并显示其正确状态吗?谢谢!

1 个答案:

答案 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();
        }
    }