Focus auf EditText setzen

  • Antworten:3
Gelöschter Account
  • Forum-Beiträge: 4

19.10.2011, 12:57:33 via Website

Hallo zusammen!

Ich habe ein Problem, von dem ich hoffe, dass ihr mir weiterhelfen könnt.

In einer Activity sind sechs Textfelder (EditText) definiert.
Sechzehn Buttons dienen dazu, etwas in diese Felder einzugeben (die virtuelle Tastatur habe ich abgeschaltet durch (myEditText.setInputType(InputType.TYPE_NULL)).

Nun möchte ich Android dazu bewegen zum nächsten EditText zu springen, wenn ein Butto gedrückt wurde.
Dazu habe ich eine Methode onButtonClick eingerichtet:

public void onButtonClick(View v) {
String wert = "";
switch (v.getId()) {
case R.id.reihe1_X: { wert = "X"; break; }
case R.id.reihe1_10: { wert = "10"; break; }
case R.id.reihe1_9: { wert = "9"; break; }
case R.id.reihe1_8: { wert = "8"; break; }
case R.id.reihe2s_7: { wert = "7"; break; }
case R.id.reihe2n_7: { wert = "7"; break; }
case R.id.reihe2s_6: { wert = "6"; break; }
case R.id.reihe2s_M: { wert = "M"; break; }
case R.id.reihe2n_6: { wert = "6"; break; }
case R.id.reihe2n_5: { wert = "5"; break; }
case R.id.reihe2n_4: { wert = "4"; break; }
case R.id.reihe3_3: { wert = "3"; break; }
case R.id.reihe3_2: { wert = "2"; break; }
case R.id.reihe3_1: { wert = "1"; break; }
case R.id.reihe3_M: { wert = "M"; break; }
case R.id.reihe4_Clear: { wert = ""; break; }
}
if (findViewById(R.id.wert1).hasFocus()) {
((EditText) findViewById(R.id.wert1)).setText(wert);
((EditText) findViewById(R.id.wert2)).requestFocus();
}
if (findViewById(R.id.wert2).hasFocus()) {
((EditText) findViewById(R.id.wert2)).setText(wert);
((EditText) findViewById(R.id.wert3)).requestFocus();
}
if (findViewById(R.id.wert3).hasFocus()) {
((EditText) findViewById(R.id.wert3)).setText(wert);
((EditText) findViewById(R.id.wert4)).requestFocus();
}
if (findViewById(R.id.wert4).hasFocus()) {
((EditText) findViewById(R.id.wert4)).setText(wert);
((EditText) findViewById(R.id.wert5)).requestFocus();
}
if (findViewById(R.id.wert5).hasFocus()) {
((EditText) findViewById(R.id.wert5)).setText(wert);
((EditText) findViewById(R.id.wert6)).requestFocus();
}
if (findViewById(R.id.wert6).hasFocus()) {
((EditText) findViewById(R.id.wert6)).setText(wert);
((EditText) findViewById(R.id.wert1)).requestFocus();
}
}


Das funktioniert aber so nicht. Wenn ich ein Wert in ein Feld (per Button) eingebe, erscheint dieser Wert zeitgleich in den übrigen 5 Felder und der Fokus wechselt nicht. Was mache ich falsch? Hat jemand eine Idee?

Vielen Dank im Voraus!
Jan

— geändert am 19.10.2011, 16:41:19

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

19.10.2011, 14:31:47 via Website

wenn du einen button klick registrierst, wird sicherlich grade der button den focus haben.

ohne jetzt den grundsätzlichen aufbau zu hinterfragen ( das könnte man mit sicherheit elleganter lösen )

warum setzt du den wert nicht direkt dann im switch in das richtige feld? da weißt du a wohin der wert gehört wenn button x gedrückt wurde

swordiApps Blog - Website

Antworten
Gelöschter Account
  • Forum-Beiträge: 4

19.10.2011, 16:40:16 via Website

Markus Gu
wenn du einen button klick registrierst, wird sicherlich grade der button den focus haben.

ohne jetzt den grundsätzlichen aufbau zu hinterfragen ( das könnte man mit sicherheit elleganter lösen )

warum setzt du den wert nicht direkt dann im switch in das richtige feld? da weißt du a wohin der wert gehört wenn button x gedrückt wurde

Hallo Markus,

das verstehe ich jetzt nicht.
Im switch wird doch abgefragt, welcher Button gerade gedrückt wurde.
Bei den If-Anweisungen wird dem EditText, das zur Zeit den Focus hat, der Wert zugewiesen. Ohne das requestFocus() klappt das auch. Nur dass ich dann eben das nächste Feld per Hand auswählen muss.

Vielleicht kannst Du mir Android-Beginner ja eine elegantere Version zeigen.

Gruß,
Jan

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

19.10.2011, 17:19:21 via Website

mag sein, dass deine variante zum teil funktioniert, aber das ist alles ein wenig umständlich gemacht.

so spontan würde ich das wie folgt lösen:

1. bei jedem Button klick inflatest du dein Layout und suchst dir deine Komponente ( dieses findViewById(xxx) )
das könntest du ja im onCreate schon machen und die GUI elemente als member der Klasse hinzufügen.
Dadurch sparst du enorm viel Rechenleistung

2. ich würde bei jedem Button android:tag="XXX" einfügen. XXX ist dann der wert, den der Button bekommt.
Dadurch sparst du dir dein switch schonmal. wert = (String)v.getTag(); und schon hast du in einer Zeile den richtigen Wert.

3. du kannst dei focusreihenfolge festlegen. beim edittext kannst du etwas in der art android:nextFocusDown="@id...." festlegen. das mal durchlesen
http://developer.android.com/guide/topics/ui/ui-events.html

das sollten alle bausteine sein, die du für deine aufgabe benötigst. jetzt musst sie nur noch richtig zusammensetzen :D

swordiApps Blog - Website

Antworten