Android: refactoriza muchos grupos de botones de radio en una actividad

Quiero crear muchos grupos de radio en una actividad como esta

enter image description here

Siguiendo con los documentos de Android, https://developer.android.com/guide/topics/ui/controls/radiobutton.html , para hacer que los datos se vinculen a Activity para get un valor como "object1 = true, object2 = false". Creé 2 funciones para get datos de 2 grupos de radio.

En el file xml, el código es

 <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> 

y creo 2 funciones como estas:

 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 } 

¿Podría tener alguna lógica para refactorizar estas cosas (como reutilizar esta function)?

Llame a la misma function en todos los onClick s

android:onClick="onRadioButtonClicked"

A continuación, agregue las 6 case en la statement 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 

}

Primer método evidente:

 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 } } 

Pero si tienes un montón de RadioGroup, una alternativa es establecer Tag en XML para cada RadioButton (utilicé para el ejemplo a continuación la cadena "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) } } } 

No revisé, pero creo que tienes una callback más apropiada, algo así como onCheckedChanged en RadioButton o RadioGroup.

  • ¿Cómo se representan las tags de los componentes web en los frameworks html de Kotlin?
  • Formulario de inicio de session con request de repetición en rxJava y Retrofit
  • kotlin-android null no se puede convertir a tipo no nulo kotlin.String
  • Kotlin: ¿Cuál es la diferencia entre Aplicar y También
  • No se puede cambiar el text de ActionMenuItemView con RxKotlin
  • Kotlin ve el nombre completo del tipo de object en el estudio de Android en Mac OS
  • Propiedad de Kotlin: "El parámetro de tipo de una propiedad debe usarse en su tipo de receptor"
  • alerta abiertaDialog en kotlin, cómo configurar ambos posts con botones de radio
  • ¿Problema de Android en la selección y deselección de elementos en un adaptador kotlin?
  • Incrementos causa falla de compilation
  • Cómo usar TypeToken + generics con Gson en Kotlin