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.

  • El ejemplo simple de kotlin imprime kotlin.Unit al imprimir el resultado de la function infijo
  • ¿Cómo dejar que un bloque kotlin vuelva a estar vacío?
  • Android onCheckedChangeListener comportamiento bizzare
  • Descompression del comstackdor de la function de mayor order de Kotlin (references invocables)
  • Agregar datos a arrayList de otra actividad
  • Firebase Android: crea usuarios con correo electrónico y contraseña en Kotlin
  • ClassCastException: android.inputmethodservice.KeyboardView no se puede convertir a com.support.mukhtar.simplekeyboard.CustomKeyboardView android
  • Assert Variable no es nulo
  • ¿Cambiar notifications en Realm para objects internos?
  • Descartar el cuadro de dialog en la tecla Atrás presionada
  • Posición de la label `@` en Kotlin cuando se denota el receptor con `this`