1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

RadioButtonGroup

Dieses Thema im Forum "Android Codeschnipsel" wurde erstellt von Tom299, 09.11.2011.

  1. Tom299, 09.11.2011 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Hallo,

    ich habe eine RadioButtonGroup erstellt, ähnlich wie man sie von Java kennt, ohne an eine View gebunden zu sein wie die RadioGroup von Android. D.h. die Radio Buttons müssen in der View/XML Layout nicht direkt zusammenliegen.

    Code:
    package de.codesnippet.helper;
    
    import java.util.HashMap;
    
    import android.widget.CompoundButton;
    import android.widget.CompoundButton.OnCheckedChangeListener;
    import android.widget.RadioButton;
    
    
    public class RadioButtonGroup implements OnCheckedChangeListener {
    
    	
    	private HashMap<Integer, RadioButton> mapRadioButtons;
    	
    	private int checkedRadioButton = 0;
    	
    	private boolean isButtonChecked = false;
    	
    	
    	public RadioButtonGroup() {
    		mapRadioButtons = new HashMap<Integer, RadioButton>();
    	}
    	
    	public boolean addRadioButton(RadioButton rButton) {
    		return addRadioButton(rButton, false);
    	}
    
    	public boolean addRadioButton(RadioButton rButton, boolean checked) {
    		if (rButton != null) {
    			// set listener
    			rButton.setOnCheckedChangeListener(this);
    			if (checked && !isButtonChecked) {
    				// if checked and no other button before was checked, set checked
    				rButton.setChecked(true);
    				isButtonChecked = true;
    			}
    			// add to hashmap
    			mapRadioButtons.put(rButton.getId(), rButton);
    			return true;
    		}
    		return false;
    	}
    	
    	@Override
    	public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        	RadioButton radio = (RadioButton)buttonView;
        	if (radio != null) {
            	if (checkedRadioButton == 0) {
            		// nothing to uncheck, only store the checked button
            		checkedRadioButton = radio.getId();
            	}
            	else {
            		// unchecked the old checked button
            		RadioButton uncheckRadio = mapRadioButtons.get(checkedRadioButton);
            		uncheckRadio.setChecked(false);
            		// store the new checked button
            		checkedRadioButton = radio.getId();
            	}
        	}		
    	}
    	
    	public RadioButton getCheckedRadioButton() {
    		if (checkedRadioButton == 0) {
    			return null;
    		}
    		else {
    			return mapRadioButtons.get(checkedRadioButton);
    		}
    	}
    }
    
    Beispiel:
    Code:
    		RadioButtonGroup radioButtonGroup = new RadioButtonGroup();
    		RadioButton btn1 = (RadioButton)findViewById(R.id.radioButton1);
    		RadioButton btn2 = (RadioButton)findViewById(R.id.radioButton2);		
    		RadioButton btn3 = (RadioButton)findViewById(R.id.radioButton3);
    		radioButtonGroup.addRadioButton(btn1, false);
    		radioButtonGroup.addRadioButton(btn2, true);
    		radioButtonGroup.addRadioButton(btn3);
    
    Erläuterung:
    Man erzeugt eine Instanz der RadioButtonGroup und fügt die gewünschten RadioButton's mit den Add-Methoden hinzu.
    Die Add-Methode ohne Parameter bewirkt das gleiche wie die Add-Methode mit dem Parameter false, es wird kein checked-Flag gesetzt.
    Mit dem Parameter true setzt man einen RadioButton auf true (checked).
    Versucht man mehrere RadioButtons auf true zu setzen, so wird nur der 1. RadioButton gesetzt, die restlichen werden ignoriert.
    Schließlich kann man mit getCheckedRadioButton() den markierten RadioButton direkt abfragen.

    Verbesserungsvorschläge werden gerne entgegengenommen. Ansonsten viel Spaß damit :)


    Gruß,
    Tom
     
  2. java_noob, 11.12.2011 #2
    java_noob

    java_noob Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    11.12.2011
    Code:
    RadioButtonGroup radioButtonGroup = new RadioButtonGroup();
    RadioButtonGroup wird bei mir rot unterstrichen und als Lösung wird das ändern zu RadioGroup angeboten. Wenn ich das mache wird
    Code:
    radioButtonGroup.addRadioButton(btn1, false);
    auch noch rot unterstrichen, wenn ich die einzige Lösung anklicke wird daraus
    Code:
    ((Object) radioButtonGroup).addRadioButton(btn1, false);
    und addRadioButton wird rot unterstrichen :scared:. Die angebotene Lösung sagt change method receiver cast. Wenn ich darauf klicke wird (object) makiert. Was soll da rein?
     
  3. Tom299, 12.12.2011 #3
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    du mußt meine klasse importieren, damit er sie kennt. kannst sie auch in dein eigenes package übernehmen.
     
  4. java_noob, 12.12.2011 #4
    java_noob

    java_noob Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    11.12.2011
    Hä? Soll der erste Code in eine eigene Datei (Klasse)? Denn bei
    Code:
    public class RadioButtonGroup implements OnCheckedChangeListener {
    wird RadioButtonGroup rot unterstrichen und gesagt das es in einer eigenen Datei definiert werden muss... :confused:
     
  5. Tom299, 12.12.2011 #5
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    ja klar, und die Datei muß dann auch RadioButtonGroup.java heissen
     
  6. java_noob, 12.12.2011 #6
    java_noob

    java_noob Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    11.12.2011
    Lässt sich jetzt zwar alles kompilieren aber es funtzt nicht: Wenn ich auf beide RadioButtons klicke werden beide aktiviert :confused2:
     
  7. swordi, 12.12.2011 #7
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009


    irgendeinen code kopieren, wird deinen java Kenntnissen nicht grad weiterhelfen.
     
  8. java_noob, 12.12.2011 #8
    java_noob

    java_noob Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    11.12.2011
    Glaub ich auch nicht... Aber ich brauch halt nur nen Code der dafür sorgt das man nicht alle Radios aktivieren kann...
     
  9. Tom299, 12.12.2011 #9
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    also bei mir funktionierts einwandfrei, nutze es selbst in meinen projekten ... du hast auch nicht die adds vergessen?
     
  10. java_noob, 12.12.2011 #10
    java_noob

    java_noob Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    11.12.2011
    Meine Starter Klassse sieht so aus:
    Code:
    package de.javatest.radiobuttons;
    
    import android.app.Activity;
    
    import android.os.Bundle;
    import java.util.HashMap;
    import android.widget.RadioGroup;
    import android.widget.CompoundButton;
    import android.widget.CompoundButton.OnCheckedChangeListener;
    import android.widget.RadioButton;
    
    public class Starter extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            //RadioButtons
            RadioButtonGroup radioButtonGroup = new RadioButtonGroup();
            RadioButton ja1 = (RadioButton)findViewById(R.id.ja1);
            RadioButton nein1 = (RadioButton)findViewById(R.id.nein1);        
            radioButtonGroup.addRadioButton(ja1, true);
            radioButtonGroup.addRadioButton(nein1, false);
            
        }
    }
     
  11. Tom299, 19.12.2011 #11
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    ok, ich hab den "fehler" gefunden ... und zwar muß der RadioButton eine ID haben, damit ich auch unterscheiden kann, welcher button gedrückt wurde.

    mir ist der fehler gerade selbst begegnet, als ich dynamisch ein paar RadioButtons erstellt habe. setzt man keine ID, steht ID immer auf -1. also einfach eine ID dem RadioButton geben, und dann klappts auch :)
     
  12. java_noob, 19.12.2011 #12
    java_noob

    java_noob Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    11.12.2011
    Soweit ich weiß haben die doch eine ID: Der 1.RadioButton hat die ID "ja1" und der 2. "nein2" oder meinst du was anderes :o
     
  13. Tom299, 20.12.2011 #13
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Nee, das ist nur der Platzhalter, damit die R-Klasse den entsprechenden Eintrag im XML findet. du mußt im xml noch die id setzen oder halt im code, ansonsten steht -1 immer drin. kannst ja selbst mal im debugger schauen ;-)

    also im xml einfach die id für jeden button setzen, z.b. android:id="@+id/btnOK" usw. dann klappts.
     
  14. java_noob, 20.12.2011 #14
    java_noob

    java_noob Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    11.12.2011
    Ja genau das hatte ich schon:
    Code:
            <RadioButton
                android:id="@+id/ja1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/yes" />
    
            <RadioButton
                android:id="@+id/nein1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/no" />
     

Diese Seite empfehlen