- 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); ArrayAdapteradapter = 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
- setMax(int max); // setzt die maximale Ausdehnung
- setProgress(int pos); // setzt die Position
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.