Android:重构一组活动中的许多单选按钮

我想在这样一个活动中创建许多广播组

在这里输入图像描述

遵循Android文档https://developer.android.com/guide/topics/ui/controls/radiobutton.html ,将数据绑定到Activity以获取像“object1 = true,object2 = false”这样的值。 我已经创建了2个函数来从2个广播组获取数据。

在xml文件中,代码是

 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="Object 1." android:textColor="#000000" android:textSize="24dp" /> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="30dp" android:orientation="horizontal"> <RadioButton android:id="@+id/pass_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRadioButtonClicked1" android:text="pass" /> <RadioButton android:id="@+id/not_pass_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRadioButtonClicked1" android:text="not pass" /> <RadioButton android:id="@+id/not_available_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRadioButtonClicked1" android:text="not available" /> </RadioGroup> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="Object 2." android:textColor="#000000" android:textSize="24dp" /> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="30dp" android:orientation="horizontal"> <RadioButton android:id="@+id/pass_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRadioButtonClicked1" android:text="pass" /> <RadioButton android:id="@+id/not_pass_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRadioButtonClicked1" android:text="not pass" /> <RadioButton android:id="@+id/not_available_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRadioButtonClicked1" android:text="not available" /> </RadioGroup> 

,我创建了2个这样的功能:

 fun onRadioButtonClicked1(view: View): Boolean? { val checked = (view as RadioButton).isChecked var value: Boolean? = null when (view.id) { R.id.pass_1 -> if (checked) value = true R.id.not_pass_1 -> if (checked) value = false R.id.not_available_1 -> if (checked) value = null } return value } fun onRadioButtonClicked2(view: View): Boolean? { val checked = (view as RadioButton).isChecked var value: Boolean? = null when (view.id) { R.id.pass_2 -> if (checked) value = true R.id.not_pass_2 -> if (checked) value = false R.id.not_available_2 -> if (checked) value = null } return value } 

难道它有一些逻辑重构这些东西(如重用这个功能)?

在所有onClick调用相同的函数

android:onClick="onRadioButtonClicked"

然后将所有6个case添加到when语句中

 fun onRadioButtonClicked(view: View): Boolean? { val checked = (view as RadioButton).isChecked var value: Boolean? = null when (view.id) { R.id.pass_1 -> if (checked) value = true R.id.not_pass_1 -> if (checked) value = false R.id.not_available_1 -> if (checked) value = null R.id.pass_2 -> if (checked) value = true R.id.not_pass_2 -> if (checked) value = false R.id.not_available_2 -> if (checked) value = null } return value 

}

首先明显的方法:

 var value1: Boolean? = null var value2: Boolean? = null fun onRadioButtonClicked(view: View) { val checked = (view as RadioButton).isChecked when (view.id) { R.id.pass_1 -> if (checked) value1 = true R.id.not_pass_1 -> if (checked) value1 = false R.id.not_available_1 -> if (checked) value1 = null R.id.pass_2 -> if (checked) value2 = true R.id.not_pass_2 -> if (checked) value2 = false R.id.not_available_2 -> if (checked) value2 = null } } 

但是如果你有足够的RadioGroup,另一种方法是为每个RadioButton设置Tag on XML(我在下面的例子中使用了字符串“TRUE”,“FALSE”):

 var value1: Boolean? = null var value2: Boolean? = null fun onRadioButtonClicked1(view: View) = onRadioButtonClicked(view) { value1 = it } fun onRadioButtonClicked2(view: View) = onRadioButtonClicked(view) { value2 = it } fun onRadioButtonClicked(view: View, function: (Boolean?) -> Unit) { val checked = (view as RadioButton).isChecked if (checked) { view.tag .let { when (it) { "TRUE" -> true "FALSE" -> false else -> null } } .let { function.invoke(it) } } } 

我没有检查,但我认为你有更适当的回调,就像RadioButton或RadioGroup onCheckedChanged。