[JAVA] Ich möchte RadioButtons an derselben Stelle auf dem Bildschirm in derselben RadioGroup platzieren

Überblick

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.

Warum kann sich RadioButton nicht frei bewegen?

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

Lösung

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.

aktuelles Problem

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

Recommended Posts

Ich möchte RadioButtons an derselben Stelle auf dem Bildschirm in derselben RadioGroup platzieren
Ich möchte im gespeicherten Zustand zum selben Bildschirm wechseln
Ich möchte eine TraceId in das Protokoll einbetten
Ich möchte den Wert in Ruby erhalten
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich möchte die Protokollausgabe unter Android vereinfachen
[Android Studio] Ich möchte Einschränkungen für die in EditText [Java] registrierten Werte festlegen.
Ich möchte das JDK auf meinem Mac-PC installieren
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Implementierung einer starken API für "Ich möchte ~~ auf dem Bildschirm anzeigen" mit einfachem CQRS
Ich möchte Swipeback auf einem Bildschirm verwenden, der XLPagerTabStrip verwendet
Ich möchte die deaktivierte Option abhängig von der Bedingung zu f.radio_button hinzufügen
Ich möchte den oberen Rand in der UITableView von Grouped entfernen (schnell)
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
So rufen Sie mehrere Namen gleichzeitig in derselben Kategorie auf
[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
[Ruby] Ich möchte nur das ungerade Zeichen in der Zeichenfolge ausgeben
Ich möchte JSP in Emacs einfacher als die Standardeinstellung schreiben.
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
Ich möchte PHP 7.2 unter Ubuntu 20.04 installieren.
Ich möchte @Autowired in Servlet verwenden
[Android] Ermittelt die getippte Position (Koordinaten) auf dem Bildschirm
Ich möchte eine E-Mail in Java senden.
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich möchte den Inhalt der Absicht var_dump
Ich möchte APP_HOME an Logback in Gradle übergeben
rsync4j - Ich möchte rsync in Java berühren.
Ich möchte irgendwann sogar in Kotlin sein
Ich möchte nach dem Dezimalpunkt abschneiden
Ich möchte den Pfad nach der neuen Registrierung ändern, nachdem ich mich mit mehreren Geräten angemeldet habe.
Ich möchte das in der Datenbank gespeicherte Protokoll morphologisch analysieren und in der Datenbank speichern, um Nachrichten 1 zu klassifizieren
[Active Admin] Ich möchte den Umfang der Sammlung angeben, die in select_box angezeigt werden soll
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
# 1_JAVA Ich möchte die Indexnummer durch Angabe eines Zeichens in der Zeichenfolge erhalten
Ich möchte die API mit Rails auf mehreren lokal eingerichteten Docker-Composes treffen
Ich war süchtig nach NoSuchMethodError in Cloud-Endpunkten
Ich möchte Combine auch in UIKit verwenden.
Ich möchte die praktischen Funktionen von Clojure in Kotlin nutzen
Ich möchte so etwas wie "cls" in Java machen
[Java] Ich möchte die Differenz zum Datum berechnen
Ich möchte NetBeans auf einem Mac verwenden → Ich kann es verwenden!
Tokoro habe ich in der Migration von Wicket 7 auf 8 umgeschrieben
Ich möchte auch in Laradock Fischschalen verwenden! !!
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Ich möchte den Bereich anhand des monatlichen Abschlusses beurteilen