Android TextField: Fokus + Soft Input programmgesteuert einstellen

80

Aus meiner Sicht habe ich eine Suche EditText und möchte programmgesteuert das Verhalten eines Klickereignisses auf dem Feld auslösen, dh das Textfeld fokussieren UND bei Bedarf eine weiche Tastatur anzeigen (falls keine harte Tastatur verfügbar ist).

Ich habe es versucht field.requestFocus(). Das Feld wird tatsächlich scharfgestellt, aber die Softtastatur wird nicht angezeigt.

Ich habe es versucht field.performClick(). Das ruft aber nur den OnClickListener des Feldes auf.

Irgendeine Idee ?

sdabet
quelle

Antworten:

148

Guter Herr, versuchen Sie Folgendes:

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

Ich bin nicht sicher, aber dies kann bei einigen Telefonen (einigen älteren Geräten) erforderlich sein:

final InputMethodManager inputMethodManager = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);
pgsandstrom
quelle
2
Gleiches Ergebnis wie requestFocus () allein ... Field erhält den Fokus, aber die Softtastatur wird nicht ausgelöst.
Sdabet
12
Ich habe das Problem schließlich gelöst, indem ich field.requestFocus()die onResume()Methode der Aktivität (anstelle der onCreate()) aufgerufen habe. Ich weiß nicht genau, warum es funktioniert ...
sdabet
31
Eine Ansicht kann nicht scharf gestellt werden, bevor sie tatsächlich auf dem Bildschirm angezeigt wurde. Dies ist nicht möglich, solange onCreate () den UI-Thread enthält. Daher wird die Ansicht direkt nach onCreate () und vor onResume () angelegt. :)
pgsandstrom
@fiddler Es funktioniert in, onResumeweil onResumees nach aufgerufen wird onCreate, also fielderst existiert, wenn onCreatees ausgeführt wird. Siehe hier: developer.android.com/reference/android/app/…
Randy
3
Ausgezeichneter Vorschlag, alter Junge. Ich erkläre; Das verdient eine positive Bewertung!
MW.
59

Hier ist der Code, der für mich funktioniert hat.

edittext.post(new Runnable() {
    public void run() {
        edittext.requestFocusFromTouch();
        InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        lManager.showSoftInput(edittext, 0);
    }
});

Das ist es! Genießen ;)

elisabel
quelle
Danke und dieser hat für mich funktioniert. Ich füge EditTextprogrammgesteuert hinzu, wenn der Benutzer die Taste drückt.
Dummköpfe
Ich habe ein EditTextModal aus einem Dialog hinzugefügt . Einige Flags werden von Android gesetzt, wodurch dieses Steuerelement keine Berührungen erhält. Wenn Sie das Feld in der ausführbaren Datei hinzufügen, werden die Flags nicht gesetzt.
JeffRegan
Es sieht so InputTypeaus, als würde das EditTextvon Android auf null gesetzt. Wenn Sie das einstellen InputType, sollte es funktionieren.
JeffRegan
Die einzige funktionierende Lösung für mich (wenn ich InputMethodManager verwende, um die erzwungene Tastatur anzuzeigen, kann ich sie nicht ausblenden)
Pavel
Keine der anderen Methoden hat bei mir funktioniert, aber diese hat funktioniert. Ich wollte ein Feld haben, in das Benutzer klicken können, um die Ansicht des Bearbeitungsdialogs zu öffnen, anstatt eine Bearbeitungszeile zu haben, in die sie für eine EditText-Ansicht klicken können. Auf einem Telefon verliert die Bearbeitungszeile den größten Teil ihrer Funktionalität, da die Ansicht des Bearbeitungsdialogs den gesamten Bildschirm abdeckt, sodass der Benutzer die Bearbeitungszeile einschließlich der darin enthaltenen Buchstaben ohnehin während der Eingabe nicht sehen kann.
Androidcoder
6

Der folgende Code hat bei mir funktioniert , nachdem die beiden anderen Antworten bei mir nicht funktioniert haben :

@Override
public void onResume() {
    super.onResume();
    SingletonBus.INSTANCE.getBus().register(this);
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen
}

Wo ShowKeyboardist

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
  //      passwordInput.requestFocusFromTouch();
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

Nach einer erfolgreichen Eingabe stelle ich auch sicher, dass ich die Tastatur verstecke

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

Technisch gesehen habe ich gerade 300 ms Verzögerung hinzugefügt, bevor ich die Soft-Tastatur-Anzeigeanforderung ausgeführt habe. Verrückt oder? Auch geändert requestFocus()zu requestFocusFromTouch().

BEARBEITEN: Verwenden Sie requestFocusFromTouch()es nicht, um dem Launcher ein Touch-Ereignis zu geben. Bleib bei requestFocus().

EDIT2: Verwenden Sie in Dialogs ( DialogFragment) Folgendes

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

anstatt

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
EpicPandaForce
quelle
requestFocusFromTouch()scheint ein Touch-Ereignis auf dem Launcher auszulösen. Das ist komisch.
EpicPandaForce
0
        field.post(new Runnable() {
            @Override
            public void run() {
                field.requestFocus();
                field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
            }
        });
Intra
quelle
0

In meinem Fall wollte ich die virtuelle Tastatur ohne Verweis auf ein bestimmtes Textfeld anzeigen, daher habe ich den ersten Teil der akzeptierten Antwort verwendet, um mich zu konzentrieren :

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

Dann zeige ich die virtuelle Tastatur :

InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
DependencyHell
quelle