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.- File|New|New Project ...
- Empty Activity auswählen, dann Next anklicken
- Name: Bmi oder etwas anderes. Dies wird auch der Name des Programms werden.
- Language: Java, sofern Sie nicht unbedingt eine neue Sprache kennenlernen wollen, um damit ausschließlich Android zu programmieren.
- Minimum SDK: Für dieses Projekt dürften selbst ältere APIs funktionieren.
- Finish
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:
- mehrere Linien untereinander (Code): Hier sehen Sie den XML-Code. Manchmal ist es einfacher, manchmal unvermeidbar, den erzeugten Code zu editieren.
- Linien und Rechteck (Split): Damit sehen Sie den XML-Code und seine Auswirkungen direkt nebeneinander.
- Rechteck mit Gebirge (Design): Der Design-Modus hat rechts das Design und links eine Palette, aus der Sie Kontrollelemente auf den Design-Schirm ziehen können.
<?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.
- Einen TextView von der Palette ins Feld ziehen und dann anklicken.
- Den linken Kreis anklicken und zum linken Rand ziehen.
- Den oberen Kreis anklicken und zum oberen Rand ziehen.
- Aus der Palette unter Text ein Plain Text ins Feld ziehen.
- Den oberen Kreis an den oberen Rand ziehen.
- Den linken Kreis auf den rechten Kreis des TextViews ziehen.
- Den rechten Kreis an den rechten Rand ziehen.
- Das TextView anklicken. Dessen unteren Kreis mit dem unteren Kreis des Plain Text verbinden.
- Einen Plain Text unter den Plain Text schieben. Anklicken.
- Den oberen Kreis des neuen mit dem unteren Kreis des bisherigen Plain-Text verbinden.
- Den rechten Kreis mit dem rechten Rand.
- Ein TextView aus der Palette links neben das neue Plain Text ziehen.
- Den linken Kreis des PlainText mit dem rechten Kreis der TextView verbinden.
- Das TextView anklicken. Dessen unteren Kreis mit dem unteren Kreis des Plain Text verbinden.
- Von der Palette unter Buttons den Button wählen und unter der untersten TextView positionieren.
- Den linken Kreis anklicken und zum linken Rand ziehen.
- Den oberen Kreis des Buttons mit dem unteren Kreis des darüber liegenden TextViews verbinden.
- Den unteren Kreis des Buttons mit dem unteren Rand verbinden.
- Ein TextView aus der Palette rechts neben Button ziehen.
- Den rechten Kreis an den rechten Rand ziehen.
- Den linken Kreis auf den rechten Kreis des Buttons ziehen.
- Den unteren Kreis mit dem unteren Kreis des Buttons verbinden.
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.- Eingabefeld anklicken.
- Unter Attribut steht: id, danach editText3. Letzteres in edGroesse ändern.
- Android-Studio schlägt vor, alle Referenzen zu ändern. Das wäre gut. Yes.
- Zweites Eingabefeld anklicken.
- Unter Attribut id nach edGewicht ändern.
- Android-Studio schlägt vor, alle Referenzen zu ändern. Das wäre gut. Yes.
- Button anklicken. id nach butRechne ändern, text nach Berechne.
- Die Textview rechts vom Button anklicken.
- id nach tvErgebnis ändern, Text auf 0 setzen.
- Die beiden TextViews links den Text auf Größe und Gewicht ändern.
<?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 ...
- den OnClickListener implementieren,
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
- Die Zeile wird rot und Android-Studio schlägt vor, die Methode onClick
zu implementieren. das tun Sie:
@Override public void onClick(View view) { }
- Der ClickListener muss auf den Button angemeldet werden.
Dazu fügen Sie in der Methode onCreate folgende Zeilen ein:
Button button = (Button) findViewById(R.id.butRechne); button.setOnClickListener(this);
Der Button wird rot. [Alt]+[Return] drücken, und Android-Studio ergänzt eine import-Zeile.
@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.