Флажок Android в пользовательских настройках не обновляется - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь реализовать пользовательский CheckBoxPreference - такой, где, если пользователь нажимает на фактический флажок, он переключает состояние, но если он нажимает на имя, он открывает вместо него фрагмент предпочтения. Для этого я переопределил метод OnBindView(View view), удалил прослушиватель кликов view и пытаюсь добавить 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();
    }
}

Как видите, я пытаюсь использовать как метод NotifyChanged Preference, так и метод Invalidate фактического виджета CheckBox, но ни один из них не работает. (Дополнительные, ненужные переменные только для отладки). Любая идея, что вызов я мог бы пропустить, что на самом деле приведет к перерисовке флажка и отображать его правильное состояние? Спасибо!

1 Ответ

0 голосов
/ 07 марта 2019

Разобрался - я должен был установить 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();
        }
    }
...