Dies ist eine alte Version des Dokuments!
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.
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>
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>
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.
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); } }); } }
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; } } }