Android - RadioGroup 的第一个按钮在 clearCheck() 和旋转后变得不可选择

Android - RadioGroup's first button becomes unselectable after clearCheck() and rotate

我在使用 RadioGroups clearCheck 方法和旋转我的应用程序时遇到问题。我认为这可能是 Google 问题?

我有一个三按钮单选组,启动时默认在 xml 中有第一个项目 selected。

我的问题是,我有一个调用单选组 clearCheck() 的按钮。如果您旋转应用程序,然后尝试按第一个单选组项目,它不会 select 它。它尝试了,它显示了动画,但它仍然未selected。

我以为我快疯了,我的代码出了点问题,但我通过制作一个新应用程序将其分解为最简单的应用程序。

如果我不预先 select 按钮 A(通过 XML 或代码),那么它可以正常工作,但我需要预先 select 编辑此按钮。

知道如何解决这个问题并默认设置 select 吗?

回购步骤

  1. 启动应用程序
  2. Select 单选按钮 B
  3. 按清除检查
  4. 旋转应用程序
  5. 按单选按钮 A

结果:收音机 A 不会 select。如果您随后按 B 或 C,您可以再次按 A,但在此之前不能。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radioGroup);

    Button clearButton = (Button) findViewById(R.id.clearButton);

    clearButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            radioGroup.clearCheck();
        }
    });
}
}


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

 <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:checkedButton="@+id/radioButtonA"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/radioButtonA"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="A" />

        <RadioButton
            android:id="@+id/radioButtonB"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="B" />

        <RadioButton
            android:id="@+id/radioButtonC"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="C" />

    </RadioGroup>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Clear"
        android:id="@+id/clearButton"
        android:layout_below="@+id/searchRadioGroup"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="114dp" />

</RelativeLayout>

旋转时,由于 android:checkedButton="@+id/radioButtonA".

,检查的 ID 被重置

如果选中了一个按钮,CompoundButtononRestoreInstanceState 会再次将选中的按钮重置为正确的选中按钮。

相反,如果没有选中按钮,buttonA 的 onRestoreInstanceState 会将其重置为未选中。 RadioGroup 不处理这种情况,因为它不是为处理取消检查而设计的。

因此,我们最终 RadioGroup tracking buttonA 为选中状态,而 buttonA 跟踪自身为未选中状态。当您单击 buttonA 时,将处理检查,但是由于 check() 方法中的短路逻辑,UI 不会更新,因为它假定由于 id 已经与手头的 mCheckedId 匹配,因此按钮应该已经被选中:

// don't even bother
if (id != -1 && (id == mCheckedId)) {
    return;
}

我想这可能被认为是一个错误,但它最终归结为您的一些奇怪的设计选择。您将其设置为默认为 buttonA,这意味着用户在正常情况下无法取消选中任何按钮,然后您提供一个清除按钮以使它们进入正常情况下无法达到的非默认状态。因此,有两种可能的解决方案可以使您的 UI 设计选择成为重点:

1) 如果您希望始终有一个选中的按钮,请将重置按钮重置为默认状态。

clearButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mRadioGroup.check(R.id.radioButtonA);
    }
});

2) 如果您希望那里可能没有选中的按钮,请不要默认为任何内容。

我的应用程序遇到了这个问题。 我作弊了 。我创建了一个新的单选按钮并选择了 gone its visibility 。 在那之后,我把 setcheked=(true).