Как проверить радиокнопки с помощью кода kotlin при использовании архитектуры MVVM?

Я использую архитектуру MVVM в своем приложении, и внутри радиогруппы есть 4 радиокнопки в сетке 2 * 2, но проблема oncheckedChanged не вызывается в классе модели представления, вот код xml:

          <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/_10sdp"
            android:checkedButton="@id/singleRadioBtn"
            android:onCheckedChanged="@{viweModel::selectOption}"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <RadioButton

                    android:layout_width="0dp"
                    android:layout_height="@dimen/_30sdp"
                    android:layout_weight="1"
                  ></RadioButton>

                <Space
                    android:layout_width="@dimen/_8sdp"
                    android:layout_height="match_parent" />

                <RadioButton

                    android:layout_width="0dp"
                    android:layout_height="@dimen/_30sdp"
                    android:layout_weight="1"
                   ></RadioButton>
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/_8sdp"
                android:orientation="horizontal">

                <RadioButton

                    android:layout_width="0dp"
                    android:layout_height="@dimen/_30sdp"
                    android:layout_weight="1"
               ></RadioButton>

                <Space
                    android:layout_width="@dimen/_8sdp"
                    android:layout_height="match_parent" />

                <RadioButton
                    android:layout_width="0dp"
                    android:layout_height="@dimen/_30sdp"
                    android:layout_weight="1"
                  ></RadioButton>
            </LinearLayout>
        </RadioGroup>

и в модели просмотра:

 fun selectOption(radioGroup: RadioGroup, id: Int)
    {
        radioGroup.check(id)
    }

Но вышеуказанная функция не вызывается. Так что я делаю неправильно здесь? Пожалуйста помоги!


person Cosmic Dev    schedule 11.06.2020    source источник


Ответы (1)


Я думаю, что ваша проблема не в DataBinding, а в том, что вы помещаете LinearLayouts внутрь RadioGroup. Так как Radiogroup является подклассом самого LinearLayout, он наводит беспорядок, поэтому в общем случае вам придется сделать что-то дополнительное в коде, чтобы он заработал (но тогда DataBinding в этом случае не так полезен), вы можете просмотреть обсуждение здесь.

Если вы попытаетесь разместить RadioButtons только внутри RadioGroup (без вложенных LinearLayouts), я думаю, ваш метод должен быть вызван.

В качестве обходного пути вы можете связать другой обратный вызов - каждый RadioButton onClick (явно установив там индекс RadioGroup):

//...........
<RadioButton
      android:layout_width="0dp"
      android:layout_height="30dp"
      android:layout_weight="1"
      android:onClick="@{(v) -> viewModel.selectOption(1)}"
></RadioButton>

<Space
     android:layout_width="8dp"
     android:layout_height="match_parent" />

<RadioButton

     android:layout_width="0dp"
     android:layout_height="30dp"
     android:layout_weight="1"
     android:onClick="@{(v) -> viewModel.selectOption(2)}"
></RadioButton>
//...............

ОБНОВЛЕНИЕ

Один из вариантов - заставить работать по вашей текущей модели:

  1. Чтобы дать идентификатор Radiogroup (чтобы его можно было использовать в выражении привязки)
  2. Чтобы дать идентификаторы RadioButtons
  3. Чтобы немного изменить метод в ViewModel

XML

<RadioGroup
    android:layout_width="match_parent"
    android:id="@+id/radioGroup"
    .......>
<RadioButton
    android:layout_width="0dp"
    android:id="@+id/button1"
    android:onClick="@{(v) -> viewModel.selectOption(radioGroup,v)}" // <- v - is your button

ViewModel

fun selectOption(radioGroup: RadioGroup, radioButton: View)
{
    radioGroup.check(radioButton.id)
}
person sergiy tikhonov    schedule 11.06.2020
comment
не могли бы вы отобразить его(@{(v) -> viewModel.selectOption(2)}) реализацию модели представления и что такое v здесь? и как убрать остальные кнопки? - person Cosmic Dev; 11.06.2020
comment
буквально лучшее и простое решение для этого, спасибо - person Cosmic Dev; 11.06.2020
comment
На самом деле есть более простое решение. Если это единственная задача, которую вы хотите использовать в ViewModel, то для этого вам действительно не нужна ViewModel. Вы можете просто установить в XML android:onClick="@{(v) -> radioGroup.check(v.id)}". - person sergiy tikhonov; 11.06.2020
comment
это должно быть установлено на радиогруппе onclick ()? но я думаю, что это хорошо проверяет все кнопки, и я хочу, чтобы за раз выбиралась только одна кнопка. - person Cosmic Dev; 11.06.2020
comment
а также нажмите кнопку «Отправить», как узнать текущую выбранную кнопку внутри модели представления? - person Cosmic Dev; 11.06.2020
comment
Нет, я хотел поместить это в каждый RadioButton onClick. Но да - это не поможет получить активную кнопку в ViewModel - person sergiy tikhonov; 11.06.2020
comment
я думаю, чтобы получить идентификатор активной кнопки, я должен сделать один Observable и продолжать публиковать в нем обновленные идентификаторы. - person Cosmic Dev; 11.06.2020