【问题标题】:Android Databinding: bind RadioGroup's selected RadioButton index in included layout file to MutableLiveData<Integer>Android 数据绑定:将包含的布局文件中 RadioGroup 的选定 RadioButton 索引绑定到 MutableLiveData<Integer>
【发布时间】:2019-07-08 23:26:25
【问题描述】:

我有一个布局文件,它定义了一个包含九个RadioButtons 的RadioGroup。此布局文件多次包含在片段布局中。

对于RadioGroup 布局的每个包含,我想以某种方式将所选RadioButton 的索引绑定到片段ViewModel 中的不同MutableLiveData&lt;Integer&gt; 变量,每个代表用户在多个九点量表上选择的分数。

数据绑定设置正确并适用于其他部分(例如,绑定点击处理程序和查看MutableLiveData&lt;Boolean&gt; 的可见性)。

到目前为止,我尝试做的是将我的 ViewModel 变量和/或不同的 MutableLiveData&lt;Integer&gt; 变量传递给包含的布局

...
<data>
    <variable name="viewModel" type="my.package.MyViewModel"/>
    <variable name="someVariable" type="androidx.lifecycle.LiveData&lt;Integer&gt;"/>
</data>
...
<include layout="@layout/radiobuttons"
    app:viewModel="@{viewModel}"
    app:someVariable="@{someVariable}"/>

并在RadioGroup 布局中使用相同的变量声明,以便能够在其中使用它们。然后我尝试使用绑定到RadioGroupandroid:onItemSelected 属性

android:onItemSelected="@{(parent, view, position, id) -> someVariable.setValue(position)}"

导致数据绑定错误:“在 android.widget.RadioGroup 上找不到参数类型为 lambda 的属性 'android:onItemSelected' 的设置器”

或将以下内容添加到RadioButtons

android:onClick="@{(view) -> viewModel.updateRadioButtonSelection(someVariable, /*INDEX HERE e.g.*/ 0)}"

但这给出了数据绑定错误“在 my.package.MyViewModel 类中找不到方法 updateRadioButtonSelection(java.lang.Integer, int)”,这意味着 MutableLiveData&lt;Integer&gt; 不是这样传递的,而是包含类型(我在 ViewModel 类中有一个方法public void updateRadioButtonSelection(MutableLiveData&lt;Integer&gt; variable, int value))。

我可以在布局中指定一个绑定,其中RadioButton 被选择到一个int 变量,而无需绕道涉及额外的代码并将RadioButton ids 转换为索引?单向绑定就足够了 - 不打算从代码中更改 ViewModel 变量。

【问题讨论】:

    标签: android android-layout android-databinding


    【解决方案1】:

    这是onCheckedChanged,而不是onItemSelected

    如果您已经拥有 ViewModel 和在那里定义的变量,我认为您不需要将变量发送到 xml。只需调用相应的方法来更新值。

    虚拟 ViewModel 内容:

      private final ObservableInt firstInflateOptionSelected = new ObservableInt();
      private final ObservableInt secondInflateOptionSelected = new ObservableInt();
      ....
      ..
      .
    
      public void setFirstInflateOptionSelected(int value) {
        this.firstInflateOptionSelected.set(value);
      }
    
      public void setSecondInflateOptionSelected(int value) {
        this.secondInflateOptionSelected.set(value);
      }
    

    现在在 xml 中,在 RadioGroup 中这样做:

    android:onCheckedChanged="@{(group, checkedId) -> viewModel.setFirstInflateOptionSelected(checkedId)}"
    

    另外,checkedId 是视图 ID,而不是位置。如果你想要这个职位。您可以将视图 ID 转换为 RadioGroup 的子位置。

    android:onCheckedChanged="@{(group, checkedId) -> viewModel.setFirstInflateOptionSelected(group.indexOfChild(group.findViewById(checkedId)))}"
    

    【讨论】:

    • 谢谢,但是我怎样才能为不同的包含设置不同的方法调用呢?因为我不能将android:onCheckedChanged 属性放在包含标签上(“无法找到属性的设置器...”)并将其直接放在该布局中使得每个包含都相同。另外,由于我经常重用RadioGroup 布局,因此ViewModel 中已经需要许多int 变量,我希望我可以避免为每个变量编写一个方法。很高兴听到更多的想法。
    • 如果你想跟踪选择的选项,你必须在xml或java中定义一个变量。如果布局在没有数据绑定的情况下被重用,数据绑定不会影响。您可以在 ViewModel 中创建公共 observableInt 变量并使用“BR.setVariable”方法将其设置为布局,无需创建 setter 方法。如果更改,它将自动更新。
    • 我不确定我是否完全理解。您是否建议遍历包含布局的每个实例并手动设置 onCheckedChanged?我正在苦苦挣扎的部分是,每次我 我的RadioGroup 布局时,我都想绑定到不同的ObservableInt(都存在于我的单个ViewModel 中),最好是直接从布局文件中它们被包含在其中。我不知道如何区分不同的包含站点(因此我的想法是将 ObservableInt 传递给包含的布局),而无需通过外部布局并手动连接所有内容。
    【解决方案2】:

    我找到了一种方法来完成我想要的。虽然我不太满意,但如果没有其他事情发生,我会接受。

    Deˣ 的回答非常有帮助,唯一我不知道该怎么做的部分是将相同布局的不同包含绑定到不同的ViewModel 变量/方法。我为我的 MutableLiveData&lt;Integer&gt; 变量添加了 setter 方法,这些变量表示 ViewModel 中所选单选按钮的索引,并在布局中声明了以下变量要包含多次:

    <data>
        <variable
            name="variableSetter"
            type="java.util.function.Consumer&lt;Integer&gt;" />
    </data>
    

    这允许我指定一个不同的 setter 方法被调用(通过

    android:onCheckedChanged="@{(group, checkedId) -> variableSetter.accept(group.indexOfChild(group.findViewById(checkedId)))}"
    

    ) 对于每个包含,如下所示:

    <include layout="@layout/..."
        app:method="@{viewModel::setQuestion1}" />
    

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 2017-01-19
      • 2016-08-14
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2016-07-24
      相关资源
      最近更新 更多