Android-Programmierung: Benutzerdialoge
Willemers Informatik-Ecke

Toast

Ein Toast ist eine Pop-Up-Meldung, die auf dem Display eine Zeitlang erscheint und von selbst wieder verschwindet.
Context context = getApplicationContext();
CharSequence text = "Kurze Hintergrundmeldung";
Toast.makeText(context, text, Toast.LENGTH_SHORT); // Beschriftung und Dauer
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0); // oben links
toast.show();  // anzeigen

Dialoge

Die Klasse Dialog ist die Basisklasse für mehrere Dialogarten. Dialoge erscheinen als kleine Rechtecke über der Activity und verharren dort, bis der Anwender sie bestätigt hat.

Neben dem Dialog für Datum und Uhrzeit ist der AlertDialog der wichtigste Dialog. Das Beispiel zeigt eine App, die einen Button enthält, der einen Dialog startet.

Erster Teil: Rahmen der Activity

Um den Dialog zu demonstrieren, wird hier eine gewöhnliche Activity angelegt. Die standardmäßig vorgegebene TextView wird durch einen Button ausgetauscht. Dieser wird per findViewById aus der Layout-Datei ermittelt und anschließend das Click-Ereignis auf die eigene Activity umgeleitet, die dazu View.OnClickListener implementiert.
package de.willemer.meinalertdialog;

import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity
        implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }
    // Hier wird onClickt eingefügt
}
Die Implementierung von View.OnClickListener erzwingt, dass die Activity onClick implementiert, was wir uns weiter unten ansehen.

XML-Layout der Activity

Die Datei activity_main.xml enthält, wie oben beschrieben, einen Button statt der TextView. Der Code sieht so aus:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Alarm"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Zweiter Teil: Reaktion auf den Button

Durch das Berühren des Buttons soll der Dialog erscheinen. Die Musik spielt also in onClick.
  1. Um einen Dialog zu erzeugen, wird ein Objekt von AlertDialog.Builder über den new-Befehl erzeugt.
  2. Dem Konstruktor wird this für die Activity übergeben. Falls der OnClickListener direkt erzeugt wird, zeigt this nicht auf die Activity. Dann müsste explizit MainActivity.this übergeben werden.
  3. Der erzeugte Builder wird nun in mehreren Schritte zur gewünschten Dialogbox konfiguriert.
    • setMessage setzt die Meldung der Dialogbox
    • setCancelable legt fest, ob ein Cancel zur Verfügung stehen soll oder ob der Benutzer sich entscheiden muss.
    • setPositiveButton hat als ersten Parameter die Beschriftung, die meist OK, Ja oder Yes lautet. Als zweiter Paramter wird ein OnClickListener des DialogInterface erwartet. Dies wird hier direkt erzeugt und enthält seinerseits wieder eine abstrakte Methode onClick, die implementiert werden muss.
    • In onClick wird der Dialog beendet (dialog.cancel()) und dann ein mehr oder weniger freundlicher Toast ausgesprochen. Kurz gesagt, erfolgt hier die Reaktion des Programms auf eine positive Auswahl des Benutzers.
    • setNegativeButton verhält sich genau wie setPositiveButton, nur eben negativer.
    • Neben setPositiveButton und setNegativButton gibt es auch setNeutralButton, wenn man drei Buttons benötigt, wurde hier aber nicht realisiert.
  4. Nach der fertigen Konfiguration wird der Builder durch den Aufruf von create eine Referenz auf einen AlertDialog zurückgeben.
  5. Dem AlertDialog kann mit setTitle eine Überschrift in den oberen Querbalken gesetzt werden.
  6. Zuletzt wird der AlertDialog mit dem Aufruf von show dargestellt.
    @Override
    public void onClick(View view) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Sollte man Computer belügen?")
               .setCancelable(false) // Ein Cancel-Button wird nicht angezeigt
               .setPositiveButton("Ja", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       dialog.cancel();
                       Toast.makeText(getApplicationContext(),
                              "Das ist nicht nett!", Toast.LENGTH_SHORT).show();
                   }
               })
               .setNegativeButton("Nein", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       dialog.cancel();
                       Toast.makeText(getApplicationContext(),
                              "So ist es recht.", Toast.LENGTH_SHORT).show();
                   }
                });
        AlertDialog alert = builder.create();
        alert.setTitle("Ethik");
        alert.show();
    }