RadioButtonGroup

T

Tom299

Stammgast
122
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
 
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?
 
du mußt meine klasse importieren, damit er sie kennt. kannst sie auch in dein eigenes package übernehmen.
 
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:
 
ja klar, und die Datei muß dann auch RadioButtonGroup.java heissen
 
Lässt sich jetzt zwar alles kompilieren aber es funtzt nicht: Wenn ich auf beide RadioButtons klicke werden beide aktiviert :confused2:
 
java_noob schrieb:
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:



irgendeinen code kopieren, wird deinen java Kenntnissen nicht grad weiterhelfen.
 
swordi schrieb:
irgendeinen code kopieren, wird deinen java Kenntnissen nicht grad weiterhelfen.
Glaub ich auch nicht... Aber ich brauch halt nur nen Code der dafür sorgt das man nicht alle Radios aktivieren kann...
 
also bei mir funktionierts einwandfrei, nutze es selbst in meinen projekten ... du hast auch nicht die adds vergessen?
 
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);
        
    }
}
 
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 :)
 
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
 
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.
 
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" />
 

Ähnliche Themen

H
Antworten
1
Aufrufe
929
Hagebutt
H
Zurück
Oben Unten