Apps für Android programmieren leicht gemacht!
Raspberry Pi mit dem Smartphone steuern - Teil 5

5. Raspberry Pi mit dem Smartphone steuern

Im 5. Teil der Artikelreihe klären wir den Bereich der Eingabe der Verbindungsdaten, denn an eben diesem letzten Bereich fehlt es unserer App noch.

Bereits in Teil 3 haben wir bisher unbeschriebene Verbindungsdaten ausgelesen und einen Eintrag im Speicher für die verbindungsdaten erstellt. In Teil 1, verwenden wir diese Daten ebenfalls, indem wir sie an die Funktion „sshBefehl“ weitergeben.

Schön und gut, doch können wir sie bisher nicht ändern, geschweige denn definieren.

 

Design:

Wieder einmal steht das Erstellen eines neuen Designs an erster Stelle, bei unserem Artikel.

Wir erstellen die Datei namens „activity_einstellungen.xml“ im Ordner res -> layout.
In dieser Datei definieren wir das Layout für unsere Einstellungsseite. Diese Seite soll 4 Textfelder und einen Knopf zum speichern enthalten. Als Eingaben benötigen die IP-Adresse unseres Raspberry’s, den Port, unseren Nutzernamen und das Passwort eben dieses Accounts.
Dementsprechend wäre es hilfreich die Textfelder nach diesen Eingaben zu benennen.

<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright 2016 www.droid-lernen.de
  ~
  ~ Licensed under the Apache License, Version 2.0 (the „License“);
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an „AS IS“ BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Verbindungsdaten:"
        android:id="@+id/textView"
        android:layout_margin="10dp" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edittext_ip"
        android:hint="IP-Adresse:"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/edittext_port"
        android:hint="Port: (Normalerweise 22)"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edittext_nutzername"
        android:hint="Nutzername:"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/edittext_passwort"
        android:hint="Passwort:"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Speichern"
        android:id="@+id/button_speichern"
        android:layout_gravity="right"
        android:layout_marginRight="16dp"
        android:background="@color/colorPrimary"
        android:textColor="@android:color/white"
        android:padding="10dp" />

</LinearLayout>

Ich war so fei und habe direkt Hints zu unseren Textfeldern hinzugefügt.
Diese Hints sind dazu da zu beschreiben, für was das Textfeld genutzt wird. Hints verschwinden automatisch, sobald der Nutzer eine erste Eingabe gemacht hat.

 

Speicherung:

Da wir unser Design nun definiert haben können wir beginnen eben dieses anzeigen zu lassen und beim Klick auf „Speichern“ die Eingaben auch zu protokollieren/speichern.

Ich lagere die Anzeige in eine externe Funktion „zeigeEinstellungen“ aus:

// Zeigt die Einstellungsseite an.
public void zeigeEinstellungen(){
    setContentView(R.layout.activity_einstellungen);

    [ ... ]

}

 

Nachfolgend müssen wir die Textfelder und den Button in Java registrieren und in eine variable speichern.
Eine kleine Fehlerabfrage, ob die Elemente auch existieren, wäre auch ganz schön.

// Den Textfeldern Namen geben, um den Inhalt schreiben und auslesen zu können.
final EditText edittext_nutzername = (EditText) findViewById(R.id.edittext_nutzername);
final EditText edittext_ip = (EditText) findViewById(R.id.edittext_ip);
final EditText edittext_passwort = (EditText) findViewById(R.id.edittext_passwort);
final EditText edittext_port = (EditText) findViewById(R.id.edittext_port);
Button speichern_button = (Button) findViewById(R.id.button_speichern);

// Fehlerabfrage
if(edittext_ip != null && edittext_nutzername != null && edittext_passwort != null && edittext_port != null && speichern_button != null) {

    [...]

}

 

Der Nutzerfreundlichkeit halber könne wir nun noch versuchen die alten Einstellungen und Verbindungsdaten in die noch leeren Textfelder zu schreiben.

// Textfelder mit bereits bestehenden Einstellungen befüllen.
edittext_ip.setText(pref.getString("ip", ""));
edittext_nutzername.setText(pref.getString("nutzername", ""));
edittext_passwort.setText(pref.getString("passwort", ""));
edittext_port.setText(pref.getInt("port", 22) + "");

[...]

 

Wir können nun auf den Speichern-Knopf reagieren, die Eingaben auf Fehler überprüfen und abspeichern.

// Auf den Klick, auf den Knopf "Speichern" reagieren.
speichern_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

    // Variablen vorbereiten, um den Inhalt der Textfelder unterspeichern zu können.
    String nutzername = "";
    String passwort = "";
    String ip = "";
    String port = "";

    // Inhalt der Textfelder in Variablen schreiben.
    nutzername = edittext_nutzername.getText().toString();
    ip = edittext_ip.getText().toString();
    passwort = edittext_passwort.getText().toString();
    port = edittext_port.getText().toString();


    if(!port.equals("") && !ip.equals("") && !nutzername.equals("") && !passwort.equals("")){

        // Verbindungsdaten laden
        editor.putString("nutzername", nutzername);
        editor.putString("passwort", passwort);
        editor.putString("ip", ip);
        editor.putInt("port", Integer.parseInt(port));

        // Einstellungen speichern
        editor.commit();

        // Gehe bei erfolgreicher Speicherung zur Startseite zurück
        zeigeStart();

    }else{

        // Fehlermeldung ausgeben, falls eines der Felder frei war.
        Toast.makeText(MainActivity.this, "Es scheinen noch Felder frei zu sein.", Toast.LENGTH_SHORT).show();

    }
}
});

 

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld