Android-Programmierung: Kontrollelemente
Willemers Informatik-Ecke
Android stellt einige Standardkontrollelemente zur Verfügung.
TextView
dient der Beschriftung der Oberfläche
EditText
Eingabefeld für Textzeilen. Davon gibt es Spezialfälle, die beispielsweise nur Zahlen erlauben oder Passwort-Felder, die die eingegebenen Zeichen verdecken.
Button
Schaltfläche, die eine Aktion auslöst
CheckBox
Markierungsfläche, die angehakt sein kann oder nicht. Repräsentiert damit einen booleschen Wert.
Switch
Umschalter, repräsentiert einen booleschen Wert
RadioButton
Eine Zusamenstellung von CheckBoxen zu einer Gruppe, in der jeweils nur einer angewählt sein darf.
Spinner
Eine Liste von Strings, aus denen der Benutzer eine auswählen kann.
ImageView
Zeigt ein Bild an.
ImageButton
Ein Button, der ein Bild anzeigt.
Toolbar
Titelleiste der App.
ProgressBar
Fortschrittsanzeige
ImageView
Zeigt ein Bild an.
Datumseingabe
DatePicker und DatePickerDialog

TextView

TextViews dienen in erster Linie der Anzeige von Texten, aber auch, um Ergebnisse anzuzeigen. Sie lösen also keine Events aus.

Mit der Methode setText kann der Text einer TextView vom Java-Programm aus verändert werden. Mit der Methode getText wird der Text des TextViews ausgelesen.

EditText

Der EditText erweitert die TextView um die Möglichkeit, Texte einzugeben. Letztlich sind die spannenden Methoden immer noch getText und setText. In den meisten Fällen reichen diese beiden Methoden zur Bearbeitung aus.

Der Rückgabewert von getText ist allerdings vom Typ Editable und muss mit der Methode toString in einen Java-String umgewandelt werden.

Soll das Ergebnis eine Zahl sein, muss der String dann noch einmal in einen Integer-Wert umgerechnet werden.

EditText edGroesse = (EditText) findViewById(R.id.edGroesse);
int groesse = Integer.parseInt(edGroesse.getText().toString());

Ereignisse von EditText

EditText kennt darüber hinaus Ereignisse. Dazu gehört vor allem der Gewinn oder Verlust des Fokus. Sie können auch alle Tastendrücke ablauschen.

Button

Ein Button wird zunächst in der XML-Layout-Datei definiert.
    <Button
        android:id="@+id/meinbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Klick!"
        />
Nach dieser Definition kann er über die Ressourcen-ID meinbutton angesprochen werden. Durch die Methode findViewById kann eine Referenz auf den Button erlangt werden.

Button meinButton = (Button) findViewById(R.id.meinbutton);
Im Beispiel heißt die Referenz auch meinButton. Das ist nicht zwingend erforderlich, hilft aber durchaus bei der Übersicht.

Eventhandling

Das Programm wird auf den Klick (oder besser den Tatsch?) des Buttons reagieren wollen. Dazu wird ein OnClickListener mit dem Button über die Methode setOnClickListener verbunden. Die Klasse OnClickListener verfügt über die Methode onClick, die vom Programm überschrieben wird. Das folgende Beispiel zeigt eine etwas verkürzte Art:
import android.widget.Button;
import android.widget.TextView;

// ...

final TextView tv = (TextView) findViewById(R.id.zeig);
Button meinButton = (Button) findViewById(R.id.meinbutton);
meinButton.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
        tv.setText("Angeklickt");
    }
});

Alternative: Activity implementiert den OnClickListener

Statt dieser sehr verkürzten Variante, kann aber auch die Activity den OnClickListener implementieren. Die Eröffnungszeile sieht dann so aus:
public class MainActivity extends AppCompatActivity
                          implements View.OnClickListener {
Wer OnClickListener implementieren will, muss auch die Methode onClick implementieren. Fehlt die Methode, wird die Zeile rot. Hier hilft Android-Studio. Überstreicht man die rot unterstrichene Zeile mit dem Mauszeiger, bietet es an, die Methode zu generieren. Diese sieht dann so aus:
@Override
public void onClick(View view) {

}
Damit ist die Activity ein OnClickListener. Dieser muss allerdings bei jedem Button explizit angemeldet werden. Dies erreicht der Aufruf der Methode setOnClickListener. Darum wird in der OnCreate-Methode der Activity die Anmeldung stehen, die etwa so aussieht:
Button meinButton = (Button) findViewById(R.id.meinButton);
meinButton.setOnClickListener(this);

CheckBox

Die CheckBox repräsentiert einen booleschen Wert. Er wird mit isChecked abgefragt.
CheckBox cbWeiblich = (CheckBox) findViewById(R.id.cbWeiblich);
boolean weiblich = cbWeiblich.isChecked();

RadioGroup und RadioButton

RadioButtons sind in RadioGroups organisiert. Nur einer der RadioButtons kann selektiert sein. Entsprechend wird in der XML-Datei erst eine RadioGroup angelegt, in die dann lauter RadioButtons hineingelegt werden. Die RadioGroup organisiert ihre RadioButtons wie ein LinearLayout.

Die Abfrage, ob ein RadioButton angeklickt ist, erfolgt wie beim CheckBox über die Methode isChecked.

RadioButtons aus RadioGroup auslesen

Will man die RadioButtons einer RadioGroup auslesen, verwendet man den Aufruf von getChild-Methoden, um dessen Mitglieder zu ermitteln. Hier werden die RadioButtons in einer ArrayList abgelegt.
ArrayList<RadioButton> rbList = new ArrayList<>();
RadioGroup rg = (RadioGroup) findViewById(R.id.radioGroup);
for (int i=0; i<rg.getChildCount(); i++) {
    View v = rg.getChildAt(i);
    if (v instanceof RadioButton) {
        rbList.add((RadioButton) v);
    }
}
Soll geprüft werden, welcher der RadioButtons ausgewählt wurde, wird die RadioGroup gefragt, welche ID denn angewählt wurde. Diese wird dann mit den IDs der RadioButtons verglichen.
RadioGroup rg = (RadioGroup) findViewById(R.id.radioGroup);
for (int i=0; i<rbList.size(); i++) {
    if (rbList.get(i).getId() ==rg.getCheckedRadioButtonId()) {
        if (i==frage.getRichtig()) {
            // Treffer!
        }
    }
}

Wechselereignis fangen

Das Ereignis eines Wechsels kann über die einzelnen Radio-Buttons erfragt werden. Es ist aber auch möglich, die RadioGroup zu fragen, ob darin ein Wechsel stattgefunden hat. Dazu wird beispielsweise in der Methode onCreate das Ereignis angemeldet.
RadioGroup rg = (RadioGroup)findViewById(R.id.rgAlter);
rg.setOnCheckedChangeListener(this);
Da mit this diese Klasse angemeldet wurde, muss sie RadioGroup.OnCheckedChangeListener implementieren.
public class MainActivity extends AppCompatActivity
        implements RadioGroup.OnCheckedChangeListener {
Entsprechend muss die Activity die Methode onCheckedChanged implementieren. Darin kann der veränderte Radio-Button über den Aufruf von getCheckedRadioButtonId ermittelt werden.
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
    RadioButton checkedRadioButton
            = (RadioButton)radioGroup.findViewById(
                    radioGroup.getCheckedRadioButtonId());
}

Spinner

Ein Spinner klappt auf und bietet aus einer Liste eine Auswahlmöglichkeit, vergleichbar mit einer Dropdownbox in anderen grafischen Oberflächen.

Ein Spinner-Element wird in der Layout-XML-Datei angelegt:

    <Spinner
        android:id="@+id/spinAlter"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/cbWeiblich"
        android:entries="@array/arrayAlter"
        />
Will man eher ein Dropdown-Design haben, kommen noch folgende beiden Zeilen hinzu.
        android:background="@android:drawable/btn_dropdown"
        android:spinnerMode="dropdown"
Am einfachsten füllt man einen Spinner über ein Array in der res/values/strings.xml.
    <string-array name="arrayAlter">
        <item>bis 24</item>
        <item>25 bis 34</item>
        <item>35 bis 44</item>
        <item>45 bis 54</item>
        <item>55 bis 64</item>
        <item>über 64</item>
    </string-array>
Alternativ kann man den Inhalt des Spinners auch aus Java heraus über ein Array füllen. So könnten in der Methode onCreate folgende Befehlszeilen stehen.
String[] str = {"bis 24", "25 bis 34", ... . "über 64"};
Spinner spinner = (Spinner) findViewById(R.id.spinAlter);
ArrayAdapter adapter = new ArrayAdapter(
        this, android.R.layout.simple_spinner_item, str);
spinner.setAdapter(adapter);

Um herauszufinden, welches Element ausgewählt wurde, wird über den Spinner die Methode getSelectedItemPosition aufgerufen. Sie liefert den Index des gewählten Elements.

Spinner spinner = (Spinner) findViewById(R.id.spinAlter);
int position = spinner.getSelectedItemPosition();
Der Wechsel des Elements kann als Ereignis gefangen werden.
spinner.setOnItemSelectedListener(this);
Damit muss die Activity das Interface AdapterView.OnItemSelectedListener implementieren und damit die Methode onItemSelected.
@Override
public void onItemSelected(AdapterView adapterView,
                           View view, int i, long l) {
    altersklasse = i;
}   

ProgressBar: Der Fortschrittsbalken

In der Layout-XML-Datei kann der Fortschrittsbalken als waagerechter Strich definiert werden.
style="@android:style/Widget.ProgressBar.Horizontal"
Dort können auch der maximale Wert max festgelegt werden.

Methoden des ProgressBar

Link

ImageView

Das Element dient zur Anzeige eines Bildes. Ein PNG-Bild beispielsweise bild.jpg kann aus dem Dateimanager des Systems direkt in das Projektverzeichnis res/drawable per Copy and Paste gezogen werden. Dabei stellt die IDE noch ein paar Rückfragen, beispielsweise bzgl des Namens.

In der Layout-Datei wird ein ImageView-Widget angelegt. Dessen Element app:srcCompat wird auf @drawable/bild gelenkt. Gegebenfalls muss die Größe des Bildes noch nachkorrigiert werden.

DatePicker

Umgezogen nach datumseingabe.htm