Android-Projekt BMI
Willemers Informatik-Ecke
Zurück zur Android-Hauptseite

Das Projekt soll den Body Mass Index (BMI) berechnen. Das ist eine einfache Formel, die das Gewicht durch das Quadrat der Größe teilt und so eine Zahl ermittelt. Dabei ist es dem BMI egal, ob das Gewicht von Muskeln oder Fett stammen. Wie unsinnig dieser Index auch sein mag. Er ist eine schöne Programmierübung.

Projekt erstellen

Im Android-Studio wird ein neues Projekt angelegt. Ein neues Projekt wird erzeugt.

Ein Blick auf MainActivity

Android-Studio erstellt automatisch eine Java-Klasse MainActivity, die AppCompatActivity erweitert. Es wird ebenfalls eine Methode OnCreate angelegt, die im Lebenszyklus der Activity im Start aufgerufen wird.

OnCreate wird beim ersten Start hochgefahren und füllt den Bildschirm der Activity mit den Elementen, die in der Datei activity_main.xml definiert ist. Der Inhalt der XML-Datei wird durch den Aufruf von setContentView entfaltet.

package com.example.firs;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Ein Blick auf die res/layout/activity_main.xml

Um den Bildschirminhalt zu bearbeiten, verändert man die Datei activity_main.xml, die im Projektordner unter res/layout steht. Klicken Sie auf diese Datei können Sie deren Inhalt bearbeiten.

In der rechten Bildschirmhälfte sehen Sie den Inhalt des Bildschirmlayouts. Rechts über dem Inhalt stehen drei Symbole, die für die Darstellungsart zuständig sind:

In der Code-Darstellung sehen Sie:
<?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">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
In dieser Version von Android-Studio wird also ein Constraint-Layout vorgegeben.

Test

Als Test sollten Sie das Projekt einmal starten: Run|Run "app"

Es ist klug, diesen Test immer wieder durchzuführen, insbesondere, wenn Sie noch keine große Erfahrung haben.

Dabei müssen Sie sich entscheiden, ob Sie per Emulation oder per Smartphone testen wollen.

Ein neuer Dialog

Zurück zur Datei res/layout/activity_main.xml. Im Design-Modus markieren Sie das Hello-World-Textview und drücken die Taste [Entf]. Daraufhin ist es weg.

Wenden Sie sich an die Palette, wechseln wenn nötig auf Common und ziehen eine Textview auf das Design-Fenster. Um das TextView erscheinen vier Kreise. Diese dienen als Ankerpunkte und können zu den Rändern oder benachbarten Kontrollelementen gezogen werden.

  1. Einen TextView von der Palette ins Feld ziehen und dann anklicken.
  2. Den linken Kreis anklicken und zum linken Rand ziehen.
  3. Den oberen Kreis anklicken und zum oberen Rand ziehen.
  4. Aus der Palette unter Text ein Plain Text ins Feld ziehen.
  5. Den oberen Kreis an den oberen Rand ziehen.
  6. Den linken Kreis auf den rechten Kreis des TextViews ziehen.
  7. Den rechten Kreis an den rechten Rand ziehen.
  8. Das TextView anklicken. Dessen unteren Kreis mit dem unteren Kreis des Plain Text verbinden.
Damit ist eine Beschriftung und ein Eingabefeld miteinander verbunden.
  1. Einen Plain Text unter den Plain Text schieben. Anklicken.
  2. Den oberen Kreis des neuen mit dem unteren Kreis des bisherigen Plain-Text verbinden.
  3. Den rechten Kreis mit dem rechten Rand.
  4. Ein TextView aus der Palette links neben das neue Plain Text ziehen.
  5. Den linken Kreis des PlainText mit dem rechten Kreis der TextView verbinden.
  6. Das TextView anklicken. Dessen unteren Kreis mit dem unteren Kreis des Plain Text verbinden.
Wir brauchen nun noch einen Button und ein Ergebnis-TextView.
  1. Von der Palette unter Buttons den Button wählen und unter der untersten TextView positionieren.
  2. Den linken Kreis anklicken und zum linken Rand ziehen.
  3. Den oberen Kreis des Buttons mit dem unteren Kreis des darüber liegenden TextViews verbinden.
  4. Den unteren Kreis des Buttons mit dem unteren Rand verbinden.
  5. Ein TextView aus der Palette rechts neben Button ziehen.
  6. Den rechten Kreis an den rechten Rand ziehen.
  7. Den linken Kreis auf den rechten Kreis des Buttons ziehen.
  8. Den unteren Kreis mit dem unteren Kreis des Buttons verbinden.
Das Ergebnis sieht nach dem Start etwas auseinandergezogen aus, aber immerhin wie eine Eingabemaske.

Elemente benennen

Die Eingabefelder müssen ausgelesen werden, der Klick des Buttons soll erkannt werden und das dritte TextView mit dem Ergebnis gefüllt werden. Dazu müssen alle einen Namen erhalten.
  1. Eingabefeld anklicken.
  2. Unter Attribut steht: id, danach editText3. Letzteres in edGroesse ändern.
  3. Android-Studio schlägt vor, alle Referenzen zu ändern. Das wäre gut. Yes.
  4. Zweites Eingabefeld anklicken.
  5. Unter Attribut id nach edGewicht ändern.
  6. Android-Studio schlägt vor, alle Referenzen zu ändern. Das wäre gut. Yes.
  7. Button anklicken. id nach butRechne ändern, text nach Berechne.
  8. Die Textview rechts vom Button anklicken.
  9. id nach tvErgebnis ändern, Text auf 0 setzen.
  10. Die beiden TextViews links den Text auf Größe und Gewicht ändern.
Die XML-Datei sieht nun etwa 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">

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Größe"
        app:layout_constraintBottom_toBottomOf="@+id/edGroesse"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/edGroesse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Name"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/textView4"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/edGewicht"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="28dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Name"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/textView5"
        app:layout_constraintTop_toBottomOf="@+id/edGroesse" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Gewicht"
        app:layout_constraintBottom_toBottomOf="@+id/edGewicht"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/butRechne"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Berechne"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView5" />

    <TextView
        android:id="@+id/tvErgebnis"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        app:layout_constraintBottom_toBottomOf="@+id/butRechne"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/butRechne" />
</androidx.constraintlayout.widget.ConstraintLayout>

Button-Klick fangen

Auch wenn das klicken eher ein Betatschen ist, heißt das passende Ereignis unter Android Click.

Um auf dieses Ereignis zu reagieren, muss die MainActivity ...

Nun setzen wir in die Methode onClick eine Aktion, die man sehen kann und probieren den Button aus:
@Override
public void onClick(View view) {
    TextView tvErg = (TextView) findViewById(R.id.tvErgebnis);
    tvErg.setText("2");
}
Nach dem erneuten Start der Anwendung sollte nach dem Antatschen des Buttons eine 2 statt einer 0 erscheinen.

Geschäftslogik einbauen

@Override
public void onClick(View view) {
    EditText edGroesse = (EditText) findViewById(R.id.edGroesse);
    int groesse = Integer.parseInt(edGroesse.getText().toString());
    EditText edGewicht = (EditText) findViewById(R.id.edGewicht);
    int gewicht = Integer.parseInt(edGewicht.getText().toString());
    if (groesse>0) {
        double bmi = gewicht / (groesse * groesse / 10000.0);
        TextView tvErg = (TextView) findViewById(R.id.tvErgebnis);
        tvErg.setText("" + bmi);
    }
}

Eingabe auf Zahlen beschränken

Im Augenblick können die Felder für Größe und Gewicht noch mit jedem beliebigen Text gefüllt werden. Tatsächlich werden die Inhalte aber zum Rechnen benutzt. Um dem Anwender das Leben zu erleichtern und dem Programmierer die Prüfung der Eingabe zu ersparen, kann man das Eingabeelement auf Zahlen beschränken.

Dazu wechselt man noch einmal zu res/layout/activity_main.xml. Dort klicken Sie im Designer die Eingafelder an. Auf der rechten Seite erscheinen die Attribute. Von besonderem Interesse ist inputType. Klicken Sie auf das Dreieck davor und setzen Sie einen Haken bei number und entfernen den bisherigen Haken. Im XML-Listing erscheint im Bereich EditText ein geänderter inputType:

Wenn Sie schon einmal dabei sind, können Sie in das Attribt text statt Name dann auch gleich eine 0 oder 1 setzen, oder den Eintrag leeren.

        android:inputType="number"
Nach dem Neustart sieht man, dass beim Anticken eines Eingabefeldes eine numerische Tastatur erscheint.