«RadioButton» et «RadioGroup» fournis par l'API Android standard.
C'est bien pour l'instant que si vous imbriquez plusieurs RadioButton
s dans unRadioGroup
, un seul peut être sélectionné en même temps, mais vous pouvez organiser le RadioButton
librement. Inacceptable.
Comme vous pouvez le voir dans la documentation, ʻandroid.widget.RadioGroup hérite de ** ʻandroid.widget.LinearLayout
**.
Tout le monde sait ce qu'est LinearLayout. En d'autres termes, il ne peut être organisé que sur une ligne horizontale ou une ligne verticale.
Pourquoi! !!
Alors je l'ai fait. Une telle classe.
FreeRadioGroup.java
import android.util.Log;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class FreeRadioGroup {
private List<RadioButton> registeredRadioButtons = new ArrayList<>();
public FreeRadioGroup(){
}
public void addChild(RadioButton rb){
if(registeredRadioButtons.contains(rb)){
Log.w("FreeRadioGroup", "RadioButton already registered. Abort registering");
}else {
registeredRadioButtons.add(rb);
rb.setOnCheckedChangeListener(OCL);
}
}
public void removeChild(RadioButton rb){
if(!registeredRadioButtons.contains(rb)){
Log.w("FreeRadioGroup", "RadioButton is not registered. Abort unregistering");
}else {
registeredRadioButtons.remove(rb);
rb.setOnClickListener(null);
}
}
public int getSelectedButtonIndex(){
for(int i=0,n=registeredRadioButtons.size();i<n;i++){
if(registeredRadioButtons.get(i).isChecked()){
return i;
}
}
return -1;
}
@Nullable
public RadioButton getSelectedButton(){
for(int i=0,n=registeredRadioButtons.size();i<n;i++){
RadioButton r = registeredRadioButtons.get(i);
if(r.isChecked()){
return r;
}
}
return null;
}
private final CompoundButton.OnCheckedChangeListener OCL = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(registeredRadioButtons.contains((RadioButton)compoundButton) && b){
for(RadioButton r : registeredRadioButtons){
if(r.equals((RadioButton)compoundButton)){
continue;
}
r.setChecked(false);
}
}
}
};
}
Pour le moment, vous pouvez le copier dans un cercle et l'utiliser.
Quand vous enregistrez RadioButton
que vous voulez enregistrer avec ʻaddChild (RadioButton rb)`, un seul des enregistrés est sélectionné en même temps.
Au contraire, je pense que c'est nécessaire à un niveau où je me demande si cela n'est pas officiellement mis en œuvre.
-Si vous essayez d'enregistrer un autre écouteur qui est appelé lorsque l'état du bouton change, il sera écrasé et ne pourra pas être utilisé.
Je n'ai pas de problème avec ça pour ce que j'utilise jusqu'à présent, donc j'y penserai quand j'aurai le temps. Ou s'il existe un bon moyen, veuillez me le faire savoir dans les commentaires. OnClick peut être utilisé normalement, donc si c'est tout ce dont vous avez besoin, il ne devrait y avoir aucun problème.
Recommended Posts