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

问题描述 投票:0回答:1

我正在尝试实现一个自定义CheckBoxPreference - 其中,如果用户点击实际的复选框,它会切换状态,但如果他们点击名称,则会打开一个首选项片段。为此,我已经覆盖了OnBindView(View view)方法,删除了view的Click侦听器,并尝试将OnClickListener分别添加到每个子视图中。但是,绑定到OnClickListenerAndroid.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方法,但都不起作用。 (额外的,不必要的变量仅用于调试)。任何想法,我可能会错过什么调用,实际上会导致重新绘制复选框并显示其正确的状态?谢谢!

android xamarin.android android-widget android-preferences
1个回答
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();
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.