Android - Installation und erste App (BMI-Berechner)

07/01/2011 09:56 Black2Jimy#1
Das Betriebssystem vieler neuer Smartphones heißt Android, man kann Apps dafür mit Hilfe von ein wenig XML gut in Java Programmieren.

[Only registered and activated users can see links. Click Here To Register...]

Am besten entwickelst du mit Eclipse,
Außerdem sind noch die folgenden Schritte nötig:

installiere das [Only registered and activated users can see links. Click Here To Register...] (Standard Developement Kit)

[Only registered and activated users can see links. Click Here To Register...] (Die Dateiträger-Abbilddatei) herunterladen und ZIP extrahieren

starte C:\Program Files\Android\android-sdk\SDK Manager und erzeuge eine
AVD (Android Visual Device) für dein Smartphone

Kopiere system.img aus dem Verzeichnis, in das extrahiert wurde und füge es in .android\avd\<AVD-Name>\ in ihrem Benutzer-Verzeichnis ein.
(Unter Mac muss eingestellt sein, dass System-Verzeichnisse sichtbar sein sollen)

zum Schluss noch eclipse starten und im Menü unter 'Help.Install New Software...' eine neue
Repository mit der URL: [Only registered and activated users can see links. Click Here To Register...] hinzufügen

mache nun ein neues Android-Projekt auf...

src/Main.java sieht dann wohl ungefähr so aus:
Code java:
Code:
package de.tutorials;
 
import android.app.Activity;
import android.os.Bundle;
 
public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // res/layout/main.xml wird als Inhalt festgelegt
        setContentView(R.layout.main);
    }
}
Um "Hallo World!" auszugeben, startest du das Projekt als Android-Application,
der Emulator braucht manchmal etwas (vor allem beim ersten Boot einer AVD), auf deinem Smartphone wird alles wesentlich schneller funktionieren.

Wähle anschließend die Code-Ansicht von res/layout/main.xml um eine richtige App zur BMI-Berechnung zu programmieren, im Beispiel verschachtle ich LinearLayouts ineinander, ich denke die Eigenschaften-Definitionen erklären sich von selbst.

Hier der XMLCode:

Code:
<?xml version="1.0" encoding="utf-8"?>
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <!-- HEIGHT -->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"<!-- Komponente nutzt allen zur Verfügung stehenden Raum -->
        android:layout_height="wrap_content"<!-- Gegenteil zu ^ -->
        >
        <TextView
            android:id="@+id/height_lable" 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="6"<!-- Anteil am Platz -->
            android:layout_marginTop="15dp"
            android:layout_marginLeft="8dp"
            android:text="@string/height_lable"
            android:textStyle="bold"
        />
        <EditText
            android:id="@+id/height_field"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:layout_marginTop="15dp"
            android:layout_marginRight="8dp"
            android:singleLine="true"
            android:gravity="right"
        /> 
    </LinearLayout>  
    <!-- WEIGHT -->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <TextView
            android:id="@+id/weight_lable" 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="6"
            android:layout_marginLeft="8dp"
            android:text="@string/weight_lable"
            android:textStyle="bold"
        />
        <EditText
            android:id="@+id/weight_field"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:layout_marginRight="8dp"
            android:singleLine="true"
            android:gravity="right"
        /> 
    </LinearLayout>  
    <!-- RESULT -->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <Button
            android:id="@+id/calculate_button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="6"
            android:layout_marginLeft="8dp"
            android:text="@string/calculate_button"
            android:textStyle="bold"
        />
        <TextView
            android:id="@+id/result_lable"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:layout_marginRight="8dp"
            android:layout_marginLeft="25dp"
            android:textStyle="bold"
        />
    </LinearLayout>
    <!-- DIAGNOSIS -->
    <TextView
        android:id="@+id/diagnosis_lable"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginRight="8dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="6dp"
        android:textStyle="bold"
    />
 
</LinearLayout>

Referenzierte String oder Ähnliches wie z.B. 'android:text="@string/calculate_button"' in Zeile 73 müssen in res/values/strings.xml deklariert werden, die dann so aussieht:

Code:
<?xml version="1.0" encoding="utf-8"?>
 
<resources>
    <string name="app_name">BMI Calculator</string>
    <string name="height_lable">Height: </string>
    <string name="weight_lable">Weight: </string>
    <string name="calculate_button">Calculate</string>  
</resources>
Mittlerweile fehlt nur noch die eigentliche Logik des Programms, die in Main.java gehört.

Im folgenden Code werden Integers wie 'R.id.result_lable' benutzt, sie liegen in der automatisch generierten Klasse 'R' und repräsentieren Ressourcen.
Code java:

Code:
package us.javauniverse.android;
 
import android.app.Activity;
import android.app.AlertDialog;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class Main extends Activity implements OnClickListener {
    
    private Button button;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // der Button wird als Java-Objekt erzeugt und bekommt eine Listener
        button = (Button) findViewById(R.id.calculate_button);
        button.setOnClickListener(this);
    }
 
    public void onClick(View v) {
        TextView tv_result = (TextView) findViewById(R.id.result_lable);
        TextView tv_diagnosis = (TextView) findViewById(R.id.diagnosis_lable);
        EditText et_height = (EditText) findViewById(R.id.height_field);
        EditText et_weight = (EditText) findViewById(R.id.weight_field);
        try{
            // BMI berechnen
            double height = Double.parseDouble(et_height.getText().toString());
            double weight = Double.parseDouble(et_weight.getText().toString());
            double result = (weight / (height*height));
            // Diagnose auswählen
            if(result < 16.5){
                tv_diagnosis.setText("Diagnosis: Severely Underweight");
                tv_result.setTextColor(getResources().getColor(R.color.red));
                tv_diagnosis.setTextColor(getResources().getColor(R.color.red));
            }
            else if(result < 18.5){
                tv_diagnosis.setText("Diagnosis: Underweight");
                tv_result.setTextColor(getResources().getColor(R.color.yellow));
                tv_diagnosis.setTextColor(getResources().getColor(R.color.yellow));
            }
            else if(result < 25){
                tv_diagnosis.setText("Diagnosis: Normal");
                tv_result.setTextColor(getResources().getColor(R.color.green));
                tv_diagnosis.setTextColor(getResources().getColor(R.color.green));
            }
            else if(result < 30){
                tv_diagnosis.setText("Diagnosis: Overweight");
                tv_result.setTextColor(getResources().getColor(R.color.yellow));
                tv_diagnosis.setTextColor(getResources().getColor(R.color.yellow));
            }
            else if(result < 35){
                tv_diagnosis.setText("Diagnosis: Obese Class I");
                tv_result.setTextColor(getResources().getColor(R.color.yellow));
                tv_diagnosis.setTextColor(getResources().getColor(R.color.yellow));
            }
            else if(result < 40){
                tv_diagnosis.setText("Diagnosis: Obese Class II");
                tv_result.setTextColor(getResources().getColor(R.color.red));
                tv_diagnosis.setTextColor(getResources().getColor(R.color.red));
            }
            else{
                tv_diagnosis.setText("Diagnosis: Obese Class III");
                tv_result.setTextColor(getResources().getColor(R.color.red));
                tv_diagnosis.setTextColor(getResources().getColor(R.color.red));
            }
            // Ergebniss runden und ausgeben
            result *= 100;
            int roundedResult = (int) result;
            result = roundedResult;
            tv_result.setText("BMI: "+result/100);
        }
        // bei falschen Eingaben (keine Zahlen)
        catch(NumberFormatException ex){
            tv_result.setText("");
            tv_diagnosis.setText("");
            new AlertDialog.Builder(this).setMessage("Please just enter numbers!").setNeutralButton("OK", null).show();
        }
    }
    
}
Auch 'R.color.yellow', ect. müssen in XML deklariert werden, und zwar in res/values/color.xml

Hier der Datei-Inhalt:
Code xml:

Code:
<?xml version="1.0" encoding="utf-8"?>
 
<resources> 
    <color name="green">#0F0</color>
    <color name="yellow">#FF0</color>
    <color name="red">#F00</color>
</resources>

Wenn du das Projekt jetzt wider startest, hast du schon eine ziemlich professionelle App,
die beliebig verändert und erweitert werden kann.

Die Dokumentation der Bibliotheken findest du unter [Only registered and activated users can see links. Click Here To Register...]

Quellen/Eigentümer: [Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...] erste-app-bmi-berechner.html

Danke Vielmals!
07/01/2011 12:10 GotDamned#2
Dein Quelllink ist nicht ganz richtig, da ist ne Leerzeile reingerutscht.
[Only registered and activated users can see links. Click Here To Register...]
Quellen darfst du übrigens auch gut sichtbar markieren und in der selben Größe wie der restliche Text machen.

Und du hast dann wirklich nur das ganze Tut kopiert?
Du erklärst hier nichts besser als da?
Sieht für mich sehr sinnlos aus. Wer das nicht eh schon kann lernt dabei nichts.
07/01/2011 15:48 Black2Jimy#3
Mich hat das interessiert hab gedacht die meisten von euch evtl. auch.
Ich kann damit eigentlich ne Menge anfangen, aber okay. :)
Teils hast du ja recht! trotzdem, wer ein wenig erfahrung hat wird das sicherlich interessieren :)