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;
}