Dies ist eine alte Version des Dokuments!


Eingabe und Event

Eingaben sind essentiell für dynamische Anwendungen und werden verwendet um auf den Benutzer zu reagieren. Hier soll nun gezeigt werden wie eine Texteingabe per Buttonklick an eine Textanzeige übergeben werden kann.

Dazu wird ein neues Projekt InputButton benötigt: Projekt erstellen.

String Resource

Es wird ein zusätzlicher String benötigt um den gewünschten Button beschriften zu können. Dieser wird mit einem Namen versehen über den dann der Zugriff stattfindet.

strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
 
    <string name="app_name">InputButton</string>
    <string name="hello_world">Hello world!</string>
 
    <!--  Ein neuer String für den Text im Button -->
    <string name="btnSend">Übernehmen</string>
 
</resources>

Layout

Im Layout wird zusätzlich zu dem vorhandenen TextView noch ein EditText und ein Button definiert. Ausserdem benötigen die Elemente eine ID für den Zugriff. Eventuelle Texte können zwar direkt eingetragen werden, es ist jedoch besser und auch üblich diese in der String-Resource zu hinterlegen. Der Einfachheit halber wird das Layout von RelativeLayout zu LinearLayout geändert. Das fehlende Attribut android:orientation muss dazu eingefügt werden.

activity_main.xml:

<!-- RelativeLayout zu LinearLayout ändern und android:orientation="vertical" einfügen -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}"
    android:orientation="vertical" >
 
    <!--  Das Textfeld für die Anzeige des zu veränderten Strings -->
    <!--  Es wird hier eine ID benötigt mit deren Hilfe man auf das Feld zugreifen kann -->
    <TextView
        android:id="@+id/tvHelloWorld"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
 
    <!--  Das Eingabefeld für den neuen String und ebenfalls die benötigte ID -->
    <EditText 
        android:id="@+id/etInput"
  	android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text" />
 
     <!--  Der Button, ebenfalls mit ID und Zugriff auf strings.xml -->
     <Button 
         android:id="@+id/btnSend"
  	 android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/btnSend" />
 
<!-- RelativeLayout zu LinearLayout ändern -->
</LinearLayout>

Activity

In der MainActivity-Klasse werden 3 Felder deklariert, mit deren Hilfe die 3 Elemente für Anzeige, Eingabe und Button benannt werden können. In der Methode onCreate gleich nach dem bereits vorhandenen Code, werden diese 3 Felder mit den Entsprechenden View-Elementen aus dem Layout initialisiert. Das Event onClick welches vom Button ausgelöst wird muss abgefangen werden. Dies passiert mit hilfe des onClickListeners, welcher direkt inline beschrieben wird. Innerhalb des Listeners wird in der Methode onClick das EIngabefeld ausgelsen und der Wert an die textanzeige übergeben.

Variante für einen Button

MainAcitivy.java

public class MainActivity extends Activity {
 
	// wird für Debug logging benötigt und ist immer sinnvoll
	private final String TAG = MainActivity.class.getSimpleName();
 
	// deklaration der Felder
	TextView tvHelloWorld;
	EditText etInput;
	Button btnSend;
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
 
 
		// initialisieren der Felder
		tvHelloWorld = (TextView) findViewById(R.id.tvHelloWorld);
		etInput = (EditText) findViewById(R.id.etInput);
		btnSend = (Button) findViewById(R.id.btnSend);
 
 
		// onclicklistener für Button
		btnSend.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View v) {
 
				// LogCat Ausgabe erzeugen
				Log.d(TAG, "Button \"btnSend\" wurde betätigt");
 
				// string vom Eingabefeld holen
				String sInput = etInput.getText().toString();
 
				// Eingabe an TextView übergeben
				tvHelloWorld.setText(sInput);
			}
		});
	}
}

Variante für mehrere Buttons

Die Variante mit dem „inline Listener“ ist zwar schnell und einfach mit der Autovervollständigung erstellt. Aber sobald mehrere Buttons benötigt werden, doch sehr unübersichtlich. Um die Übersichtlichkeit zu erhalten muss die Methode OnClickLIstener.onClick() in die Activity übernommen werden. Dazu wird vorher der OnClickListener implementiert.

Dann bemängelt Eclipse von sich aus die fehlende Methode, was an der roten Unterstreichung des Klassennamens (MainActivity) zu sehen ist. Bewegt man nun die Maus über das unterstrichene Wort, öffnet sich ein Fenster und Eclipse schlägt unter anderem vor die fehlende Methode hinzuzufügen.

Der OnClickListener wird diesesmal nicht direkt kompletiert, sondern nur gesetzt. Ein einfaches this genügt als Argument. In der nun vorhandenen onClick-Methode kann die ID abgefragt werden um auf unterschiedliche Buttons zu reagieren.

public class MainActivity extends Activity implements OnClickListener {
 
	// wird für Debug logging benötigt und ist immer sinnvoll
	private final String TAG = MainActivity.class.getSimpleName();
 
	// deklaration der Felder
	TextView tvHelloWorld;
	EditText etInput;
	Button btnSend;
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
 
 
		// initialisieren der Felder
		tvHelloWorld = (TextView) findViewById(R.id.tvHelloWorld);
		etInput = (EditText) findViewById(R.id.etInput);
		btnSend = (Button) findViewById(R.id.btnSend);
 
		// onclicklistener für Button
		btnSend.setOnClickListener(this);
	}
 
	@Override
	public void onClick(View v) {
 
		// abfrage der ID für Vergleich mit Button Id
		switch(v.getId()) {
 
			// abfrage des Buttons
			case R.id.btnSend:
 
				// LogCat Ausgabe erzeugen
				Log.d(TAG, "Button \"btnSend\" wurde betätigt");
 
				// string vom Eingabefeld holen
				String sInput = etInput.getText().toString();
 
				// Eingabe an TextView übergeben
				tvHelloWorld.setText(sInput);
 
				break;
		}
	}
 
}

Das Ergebniss