Android-Programmierung GUI
Willemers Informatik-Ecke
Siehe auch: Gesten

Ein Button wird aktiv

Sobald Buttons verwendet werden, muss auf einen "Klick" reagiert werden, auch wenn dieser eigentlich nur ein Tatschen ist. Dazu muss die Activity einen OnClickListener implementieren.
public class MainActivity extends Activity implements View.OnClickListener {
   ...
Natürlich kann auch eine separate Klasse als OnClickListener angelegt werden. Beim Anlegen eines Buttons wird durch den Aufruf der Methode setOnClickListener angegeben, welche Klasse den Listener implementiert. Hier ist es die Activity selbst.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }
Die Implementierung von OnClickListener erzwingt, dass die Methode OnClick implementiert werden muss. Sie wird erhält einen Parameter vom Typ View, aus dem über die Methode getId ermittelt wird, wer der Verursacher des Events ist.
    @Override
    public void onClick(View view) {
        if (view.getId()==R.id.button) {
            // hier passiert etwas
        }
        ...
    }

Anlegen eines Listener-Objekts

Anstatt die Klasse den OnClickListener implementieren zu lassen, kann ein Listener-Objekt erzeugt werden und dieses und dieses an setOnClickListener übergeben werden.
protected void onCreate(...) {
    // ...
    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(buttonListener);
    // ...
}

View.OnClickListener buttonListener = new View.OnClickListener() {
    public void onClick(View v) {
        // Auf Klick reagieren
    }
};
Ein Objekt von OnClickListener kann eigentlich nicht direkt erzeugt werden, weil die abstrakten Methoden eine Erzeugung verhindern. Aus diesem Grund wird hier die abstrakte Methode beiläufig implementiert, so dass einer Erzeugung des Objekts nichts im Wege steht.

Direktbehandlung mit anonymen Objekt

In vielen Listings wird das Listener-Objekt nicht explizit erzeugt, sondern anonym beim Aufruf von setOnClickListener per new im Parameter erzeugt. Damit wird ein Objekt erzeugt, das nicht explizit genannt wird, aber übergeben werden kann.

Da man aus einem Interface mit seinen abstrakten Methoden nur ein Objekt erzeugen kann, wenn man die Methoden implementiert, geschieht das sofort. Android-Studio wird den Fehler also wie im Listing dargestellt auflösen und die benötigte Methode onClick erzeugen.

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener( new View.OnClickListener() {
    public void onClick(View v) {
        // Auf Klick reagieren
    }
});

Listener in der XML-Datei der Activity definieren

Man kann einen Listener auch in der XML-Datei für die Activity an den Button anhängen. In der XML-Datei wird bei der Definition des Buttons die folgende Zeile eingefügt.
android:onClick="onButtonClick"
Damit wird die Verknüpfung zur Behandlungsmethode geschaffen. In der Activity muss nun eine Methode onButtonClick definiert sein, die einen Parameter der Klasse View hat.
public void onButtonClick(View v) {
    Button button = (Button) v;
    // ...
}

Touchscreen

OnTouchListener implementieren

Die Implementierung des Interface OnTouchListener erzwingt die Implementierung der Methode onTouch, die bei Berührung aufgerufen wird.
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        ...
        return false;
    }

Direkte Bearbeitung durch onTouchEvent

In einer View oder Activity können Sie aber auch direkt die Methode onTouchEvent überschreiben.
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
        case (MotionEvent.ACTION_DOWN): ... return true;
        case (MotionEvent.ACTION_MOVE): ... return true;
        case (MotionEvent.ACTION_UP): ... return true;
        case (MotionEvent.ACTION_CANCEL): ... return true;
        case (MotionEvent.ACTION_OUTSIDE): ... return true;
        return super.onTouchEvent(event);
    }
Die Rückgabe von true signalisiert, dass Sie das Event vollständig bedient haben und sich niemand anderes darum kümmern muss. Aus dem übergebenen Event können Sie mit getAction ermitteln und die Aktion mit den Konstanten der Klasse MotionEvent vergleichen.

Tastatur: OnKeyListener

Für Hardwaretasten wird ein OnKeyListener eingesetzt. Soll eine View oder Activity auf Hardwaretasten reagieren, implementieren Sie das Interface OnKeyListener. Diese Implementation wird über den Aufruf setOnKeyListener mit der View bzw. Activity verbunden.

Die Klasse, die OnKeyListener implementiert muss nur die Methode onKey überschreiben. Die Methode onKey erhält als Parameter die View, den Key-Code und das Event:

    @Override
    public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
        ...
        return false;
    }