RadioButton
und RadioGroup
werden von der Standard-Android-API bereitgestellt.
Bisher ist es gut, dass, wenn Sie mehrere "RadioButton" in einer "RadioGroup" verschachteln, nur einer gleichzeitig ausgewählt werden kann, Sie den "RadioButton" jedoch frei anordnen können. Inakzeptabel.
Wie Sie in der Dokumentation sehen können, erbt "android.widget.RadioGroup" ** "android.widget.LinearLayout" **.
Jeder weiß, was LinearLayout ist. Mit anderen Worten, es kann nur in einer horizontalen oder einer vertikalen Reihe angeordnet werden.
Warum! !!
Also habe ich es geschafft. Eine solche Klasse.
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);
}
}
}
};
}
Vorerst können Sie es in einem Kreis kopieren und verwenden.
Wenn Sie "RadioButton" registrieren, bei dem Sie sich bei "addChild (RadioButton rb)" registrieren möchten, wird nur einer der registrierten gleichzeitig ausgewählt.
Im Gegenteil, ich denke, es ist auf einer Ebene notwendig, auf der ich mich frage, ob dies nicht offiziell umgesetzt wird.
-Wenn Sie versuchen, einen anderen Listener zu registrieren, der aufgerufen wird, wenn sich der Schaltflächenstatus ändert, wird dieser überschrieben und kann nicht verwendet werden.
Ich habe keine Probleme damit für das, was ich bisher benutze, also werde ich darüber nachdenken, wenn ich Zeit habe. Oder wenn es einen guten Weg gibt, lass es mich bitte in den Kommentaren wissen. OnClick kann normal verwendet werden. Wenn das alles ist, was Sie brauchen, sollte es kein Problem geben.