在 MaterialButtonToggleGroup 上需要进行单选设置

14

在使用app:singleSelection="true"时,是否有选项可以使MaterialButtonToggleGroup必须选择一个按钮?

当点击不同的按钮时,一切正常(所有其他按钮都取消选择),但是当您单击相同的(已经选中的)按钮时,它会自动取消选择,并且我希望保持选中状态。

我的示例:

 <com.google.android.material.button.MaterialButtonToggleGroup
      android:layout_width="wrap"
      android:layout_height="wrap_content"
      app:singleSelection="true">

      <com.google.android.material.button.MaterialButton
        android:id="@+id/filterA"
        style="@style/Widget.MaterialComponents.Button.OutlinedButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="A"/>

      <com.google.android.material.button.MaterialButton
        android:id="@+id/filterB"
        style="@style/Widget.MaterialComponents.Button.OutlinedButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="B"/>

      <com.google.android.material.button.MaterialButton
        android:id="@+id/filterC"
        style="@style/Widget.MaterialComponents.Button.OutlinedButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="C"/>

    </com.google.android.material.button.MaterialButtonToggleGroup>

我已经提交了一个功能请求,因为我找不到一个合适的解决方案。https://issuetracker.google.com/issues/132823510 - Vladimir Petrovski
app:singleSelection="true" 对我无效。所有按钮仍然可以同时选择。 - Avi
4个回答

26
你可以在布局中使用app:selectionRequired属性进行定义:
    <com.google.android.material.button.MaterialButtonToggleGroup
        app:selectionRequired="true"
        app:checkedButton="@id/..."
        app:singleSelection="true">

您还可以使用方法setSelectionRequired

buttonGroup.setSelectionRequired(true);

注意:这需要至少版本为1.2.0-alpha03


1
是的,你说得对,Google团队添加了这个功能 -> https://issuetracker.google.com/issues/132823510 - Vladimir Petrovski

4

我使用以下方法使其工作:

toggle_group.addOnButtonCheckedListener { group, checkedId, isChecked ->
    if (group.checkedButtonId == -1) group.check(checkedId)
}

如果启用了singleSelection,条件语句仅在用户点击已选中的按钮时评估为true,这将导致没有任何按钮被选中。当发生这种情况时,我们只需要检查他们取消选中的按钮即可。

如何在勾选时映射子级按钮? - Faisal
1
谢谢这个。这是最简单的解决方案,没有依赖于alpha版本。 - Adi B

2

我也遇到了这个问题,我发现使用app:singleSelection="true"可以解决。

    String selectedValue = "Male";
    genderBtnToggle.addOnButtonCheckedListener(new MaterialButtonToggleGroup.OnButtonCheckedListener() {
        @Override
        public void onButtonChecked(MaterialButtonToggleGroup group, int checkedId, boolean isChecked) {
            MaterialButton btn = genderBtnToggle.findViewById(checkedId);
            if (!isChecked && btn.getText().toString().equals(selectedValue)) {
                genderBtnToggle.check(checkedId);
            }

            if (isChecked) {
                selectedValue = btn.getText().toString();
            }
        }
    });

0

我也遇到了这个问题,会等待谷歌的永久修复。同时,我做了以下操作以确保至少有一个按钮被选中。

    final MaterialButtonToggleGroup tGroup = view.findViewById(R.id.toggleGroup);
    final MaterialButton breast = tGroup.findViewById(R.id.breast);
    final MaterialButton bottle = tGroup.findViewById(R.id.bottle);
    final MaterialButton solids = tGroup.findViewById(R.id.solids);

    View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tGroup.check(v.getId());
        }
    };

    breast.setOnClickListener(onClickListener);
    bottle.setOnClickListener(onClickListener);
    solids.setOnClickListener(onClickListener);

希望这有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接