Android-Programmierung GUI: View

Willemers Informatik-Ecke

Das einzig seriöse Javabuch :-) Mehr...

.. enthält ein Kapitel zur Android-Programmierung.
Bei Amazon bestellen
2015-12-12
Auf diesen Seiten halte ich meine Erfahrungen im Bereich der Android-Programmierung fest, um sie später nachschlagen zu können. Die Ausführungen sind kein vollständiger Kurs, manchmal nur Notizen, aber vielleicht anderen hilfreich.

Eine View als Zeichenfläche

Die Kontrollelemente wie Eingabefelder oder Datumspicker sind von Android vorgefertigte Views. Sie haben einen Bereich, in dem sie sich darstellen und in dem sie die Ereignisse überwachen.

Sie können also eine View entwickeln, die sich wie ein Kontrollelement verhält. In vielen Fällen wird die View allerdings verwendet, um eine Vollgrafik auf dem Display erscheinen zu lassen.

Um eine View selbst zu schreiben, erweitert man die Klasse View. In der Regel soll die View auch Aktionen des Anwenders verarbeiten. Dazu muss man noch einen Listener überschreiben.

Zunächst müssen die Konstruktoren geschrieben werden. Diese müssen die Konstruktoren der Elternklasse aufrufen. Weitere Initialisierungen lagert man sinnvollerweise in eine eigene Methode aus, die man von den Konstruktoren aufruft.

public class BermudaView extends View implements OnTouchListener {
    public BermudaView(Context context) {
        super(context);
        initBermuda();
    }
    public BermudaView(Context context, AttributeSet ats) {
        super(context, ats);
        initBermuda();
    }
    public BermudaView(Context context, AttributeSet ats, int stil) {
        super(context, ats, stil);
        initBermuda();
    }
Eine View überschreibt im Allgemeinen zwei Methoden. Mit onMeasure wird die Größenanforderung mit dem Layout abgeklärt und onDraw übernimmt die Malerarbeiten innerhalb des eigenen Rechtecks.

onMeasure

@Override
protected void onMeasure(int wMeasureSpec, int hMeasureSpec) {
    // berechne die Breite und Hoehe
    int w = getViewWidth(wMeasureSpec);
    int h = getViewHeight(hMeasureSpec);
    // ruft immer diese Methode
    setMeasuredDimension( w, h );
}
Die Methoden getViewWidth und getViewHeight werden lokal implementiert, wobei sie die in den Spec übergebenen Vorgaben aus dem Layout auswerten.
    private int getViewWidth(int measureSpec) {
    	int specMode = MeasureSpec.getMode(measureSpec);
    	int specSize = MeasureSpec.getSize(measureSpec);
    	int width = specSize;
    	if (specMode == MeasureSpec.AT_MOST) {
    	} else if (specMode == MeasureSpec.EXACTLY) {
    	} else if (specMode == MeasureSpec.UNSPECIFIED) {
            // hier eine Vorgabe machen, wenn Layout nichts spezifiziert
    	}
    	return width;
    }
    private int getViewHeight(int measureSpec) {
    	int specMode = MeasureSpec.getMode(measureSpec);
    	int specSize = MeasureSpec.getSize(measureSpec);
    	int height = specSize;
    	if (specMode == MeasureSpec.AT_MOST) {
    	} else if (specMode == MeasureSpec.EXACTLY) {
    	} else if (specMode == MeasureSpec.UNSPECIFIED) {
            // hier eine Vorgabe machen, wenn Layout nichts spezifiziert
    	}
    	return height;
    }

Zeichnungen in der Methode onDraw

Die View ist dafür verantwortlich, ihren Inhalt jederzeit darstellen zu können. Dazu ruft das System die Methode onDraw auf.
    @Override
    public void onDraw(Canvas canvas) {
Als Parameter erhält sie ein Objekt von Canvas. Das Canvas stellt die Zeichenfläche dar und bietet diverse Zeichen-Methoden an.

Eintragung in der Layout-Datei

In der activity.xml wird die eigene View wie ein normaler View eingetragen.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
    <TextView
     ... />
    ...
    <de.willemer.bermuping.BermudaView
        android:id="@+id/bermudaview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
...
</LinearLayout>

Homepage (C) Copyright 2015 Arnold Willemer