====== 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: [[android:preparationes_geht_los|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:**
InputButtonHello world!Übernehmen
==== 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:**
==== 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.
{{:android:missingmethod.png?nolink&700|}}
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 ====
{{:android:inputbutton.png?nolink&700|}}