gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:29:57 25 4
gpt4 key购买 nike

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

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

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

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

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

知道如何解决这个问题并默认选择 A 吗?

repo 步骤

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

结果: radio A 不会选择。如果您随后按 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 跟踪 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) 如果您希望那里可能没有选中的按钮,请不要默认任何内容。

关于Android - RadioGroup 的第一个按钮在 clearCheck() 和旋转后变得不可选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31752800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com