[JAVA] Je veux placer RadioButtons dans le même RadioGroup à n'importe quelle position de l'écran

Aperçu

«RadioButton» et «RadioGroup» fournis par l'API Android standard.

C'est bien pour l'instant que si vous imbriquez plusieurs RadioButtons dans unRadioGroup, un seul peut être sélectionné en même temps, mais vous pouvez organiser le RadioButton librement. Inacceptable.

Pourquoi RadioButton ne peut-il pas se déplacer librement?

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

Solution

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.

problème actuel

-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

Je veux placer RadioButtons dans le même RadioGroup à n'importe quelle position de l'écran
Je souhaite passer au même écran dans l'état enregistré
Je veux intégrer n'importe quel TraceId dans le journal
Je veux obtenir la valeur en Ruby
Je veux retourner la position de défilement de UITableView!
Je souhaite simplifier la sortie du journal sur Android
[Android Studio] Je souhaite définir des restrictions sur les valeurs enregistrées dans EditText [Java]
Je veux mettre le JDK sur mon PC Mac
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Implémentation d'une API forte pour "Je veux afficher ~~ à l'écran" avec un simple CQRS
Je souhaite utiliser le balayage arrière sur un écran qui utilise XLPagerTabStrip
Je veux ajouter l'option désactivée à f.radio_button en fonction de la condition
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Comment appeler plusieurs noms à la fois dans la même catégorie
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
[Ruby] Je souhaite afficher uniquement le caractère impair dans la chaîne de caractères
Je veux écrire une JSP dans Emacs plus facilement que la valeur par défaut.
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Je souhaite afficher un message d'erreur lors de l'inscription dans la base de données
Je souhaite installer PHP 7.2 sur Ubuntu 20.04.
Je veux utiliser @Autowired dans Servlet
[Android] Obtenez la position tapée (coordonnées) sur l'écran
Je souhaite envoyer un e-mail en Java.
J'ai essayé d'organiser la session en Rails
Je veux var_dump le contenu de l'intention
Je souhaite transmettre APP_HOME pour me connecter à Gradle
rsync4j --Je veux toucher rsync en Java.
Je veux être finalement même à kotlin
Je veux tronquer après la virgule décimale
Je souhaite modifier le chemin après une nouvelle inscription après m'être connecté avec plusieurs appareils.
Je souhaite analyser morphologiquement le journal stocké dans la base de données et le stocker dans la base de données pour classer les messages 1
[Active Admin] Je souhaite spécifier l'étendue de la collection à afficher dans select_box
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
# 1_JAVA Je veux obtenir le numéro d'index en spécifiant un caractère dans la chaîne de caractères
Je veux accéder à l'API avec Rails sur plusieurs docker-composes configurés localement
J'étais accro à NoSuchMethodError dans Cloud Endpoints
Je souhaite également utiliser Combine dans UIKit.
Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin
Je veux faire quelque chose comme "cls" en Java
[Java] Je souhaite calculer la différence par rapport à la date
Je veux utiliser NetBeans sur Mac → Je peux l'utiliser!
Tokoro j'ai réécrit dans la migration de Wicket 7 à 8
Je veux aussi utiliser des coquillages à Laradock! !!
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je veux juger la gamme en utilisant le diplôme mensuel