Dialog: Edittext hat Fokus, aber kein Keyboard erscheint

  • Antworten:8
Christoph Wittstock
  • Forum-Beiträge: 7

06.11.2011, 22:17:31 via Website

Hey Leute,

der Titel sagt eigentlich schon alles. Ich habe einen Dialog, der unter anderem ein EditText enthält. Gehen wir der Einfachheit halber mal davon aus, wir haben nur ein EditText und ein Button in einem Dialog. Nun hat das EditText automatisch (ohne das irgendwas einstelle oder programmiere) den Fokus. Es erscheint jedoch kein Keyboard, was nicht besonders Benutzerfreundlich ist. Drücke ich aber in das bereits fokusierte EditText, erscheint auch mein Keyboard.
Ich hab schon so einige Wege versucht, das Keyboard manuell auszufahren, jedoch bisher kein Erfolg:
1InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
2mgr.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

requestFocus(editText); hilft mir auch nicht. onFocusChange ebenfalls nicht.
Nun bin ich inzwischen Ratlos, aber hier wird sich sicher jemand finden. :)

Danke schon mal.

Antworten
Gian U.
  • Forum-Beiträge: 117

07.11.2011, 18:35:38 via Website

Vielen Dank für die Frage! :-)

Jetzt habe ich mich endlich damit beschäftigt, denn das hat mich schon lange gestört, ohne dass ich was dagegen unternahm.

So und jetzt zur Lösung. Du kannst einfach folgenden Code verwenden:

1edit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
2 @Override
3 public void onFocusChange(View v, boolean hasFocus) {
4 if (hasFocus) {
5 dialog.getWindow().setSoftInputMode(
6 WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
7 }
8 }
9});

Quelle: http://stackoverflow.com/questions/2403632/android-show-soft-keyboard-automatically-when-focus-is-on-an-edittext

Ich hoffe es hilft dir!

Gian

Mnemono - Efficient learning!

Antworten
Christoph Wittstock
  • Forum-Beiträge: 7

07.11.2011, 22:34:36 via Website

das hilft mir leider nicht. Das Problem ist, dass der Fokus automatisch beim Öffnen des Dialogs auf dem EditText liegt. Wenn ich anschließend das EditText nochmal antippe, dann öffnet sich auch die Tastatur. Ohne weiteren Code.
Hier ist mal der Code um meinen Dialog zu öffnen:
1final Dialog dialog = new Dialog(this);
2 dialog.setContentView(R.layout.dialog_new_meeting);
3 dialog.setTitle(R.string.create_meeting);
4 dialog.setCancelable(true);
5 dialog.setCanceledOnTouchOutside(true);
6 final EditText editText = (EditText) dialog
7 .findViewById(R.id.new_meeting_dialog_text);
8
9 Button send_button = (Button) dialog
10 .findViewById(R.id.new_meeting_dialog_send);
11 send_button.setOnClickListener(new OnClickListener() {
12 @Override
13 public void onClick(View v) {
14 String meetingTitle = editText.getText().toString();
15 int restricted = (((CheckBox) dialog
16 .findViewById(R.id.new_meeting_dialog_restricted))
17 .isChecked()) ? 1 : 0;
18 if (!meetingTitle.equals(""))
19 newMeeting(meetingTitle, restricted, MyGlobals.userId, 0,
20 dialog);
21 else
22 Toast.makeText(getApplicationContext(),
23 getString(R.string.error_noValues),
24 Toast.LENGTH_SHORT).show();
25 }
26 });
27
28 editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
29 @Override
30 public void onFocusChange(View v, boolean hasFocus) {
31 if (hasFocus) {
32 dialog.getWindow()
33 .setSoftInputMode(
34 WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
35 }
36 }
37 });
38
39 dialog.show();

Und hier das XML des Dialogs:
1<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="fill_parent"
3 android:layout_height="fill_parent" >
4
5 <EditText
6 android:id="@+id/new_meeting_dialog_text"
7 android:layout_width="fill_parent"
8 android:layout_height="wrap_content"
9 android:layout_alignParentLeft="true"
10 android:layout_marginLeft="5dip"
11 android:layout_marginRight="5dip"
12 android:maxLength="60"
13 android:singleLine="true"
14 android:text="" >
15
16 <requestFocus />
17 </EditText>
18
19 <CheckBox
20 android:id="@+id/new_meeting_dialog_restricted"
21 android:layout_width="fill_parent"
22 android:layout_height="wrap_content"
23 android:layout_alignLeft="@+id/new_meeting_dialog_text"
24 android:layout_below="@+id/new_meeting_dialog_text"
25 android:text="@string/restricted_meeting" >
26 </CheckBox>
27
28 <Button
29 android:id="@+id/new_meeting_dialog_send"
30 android:layout_width="wrap_content"
31 android:layout_height="wrap_content"
32 android:layout_alignLeft="@+id/new_meeting_dialog_restricted"
33 android:layout_below="@+id/new_meeting_dialog_restricted"
34 android:text="@string/add" >
35 </Button>
36
37</RelativeLayout>

Antworten
Gian U.
  • Forum-Beiträge: 117

07.11.2011, 22:44:40 via Website

Kannst du mal folgenden Code ausprobieren (vor dialog.show() einsetzen)? Ich bin mir zwar überhaupt nicht sicher, ob er funktioniert...

EDIT: Ich hab gerade bemerkt, das dazu API Level 8 benötigt wird. Für die meisten Apps daher wahrscheinlich unbrauchbar...

1dialog.setOnShowListener(new OnShowListener() {
2
3 @Override
4 public void onShow(DialogInterface dialog) {
5 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
6 imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
7 }
8});

— geändert am 07.11.2011, 22:45:30

Mnemono - Efficient learning!

Antworten
Christoph Wittstock
  • Forum-Beiträge: 7

07.11.2011, 22:46:55 via Website

Und was muss ich dafür importieren? Bekomme folgenden Fehler: The method setOnShowListener(new OnShowListener(){}) is undefined for the type Dialog

Antworten
Gian U.
  • Forum-Beiträge: 117

07.11.2011, 22:47:53 via Website

Ich hab es gerade vorher in den anderen Beitrag eingesetzt: Es wird API Level 8 benötigt...

Mnemono - Efficient learning!

Antworten
Christoph Wittstock
  • Forum-Beiträge: 7

07.11.2011, 22:50:52 via Website

Habs auf Api Level 8 umgestellt. Doch auch dann bleibt meine Tastatur zu! Zum Mäusemelken!

Antworten
Gian U.
  • Forum-Beiträge: 117

07.11.2011, 23:02:10 via Website

Benutzt du evtl. den Emulator zum testen? Oder ein Device mit Hardwaretastatur?

Mnemono - Efficient learning!

Antworten
Christoph Wittstock
  • Forum-Beiträge: 7

07.11.2011, 23:25:48 via Website

Ja, du hast Recht. Auf dem Device klappt es mit
1dialog.setOnShowListener(new OnShowListener() {
2
3 public void onShow(DialogInterface dialog) {
4 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
5 imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
6 }
7 });
Gibts jetzt noch einen Weg das ganze ohne API Level >= 8 zu machen? :/

Antworten