11 Stimmen

Wie wird die Soft-Tastatur von einem Dienst aus angezeigt?

Kurze Frage: Ist es möglich (und wie), die Soft-Tastatur von einem Dienst aus anzuzeigen?

Lange Frage: Ich habe einen Dienst geschrieben, der eine "obere Leiste" erstellt, die oben auf allen Aktivitäten angezeigt wird und einen EditText enthält. Ich möchte die Soft-Tastatur anzeigen, wenn dieser EditText angeklickt wird, aber dies geschieht nicht.

Natürlich habe ich versucht, dies von der Service's onFocusChange() und onClick():

InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

Die Abhilfe, die ich gefunden habe, besteht darin, die aktuelle Aktivität aufzufordern, die Tastatur anzuzeigen, indem ich die Klasse Activity erweitere und eine AIDL-Schnittstelle hinzufüge. Der Nachteil ist, dass jedes Tastenereignis an den Dienst zurückgeschickt (über eine andere AIDL-Schnittstelle) und manuell in Unicode umgewandelt werden muss.

Wenn die aktuelle Aktivität einen EditText enthält, funktioniert das Soft-Keyboard außerdem nur für die Aktivität und wird nicht mehr angezeigt, wenn der EditText des Dienstes ausgewählt ist.

Was verhindert, dass die Soft-Tastatur des Dienstes angezeigt wird, wenn die aktuelle Aktivität einen EditText hat? Könnte es eine Android-Beschränkung sein?

3voto

Ich bin mit einem ähnlichen Problem konfrontiert worden. Ich habe es jetzt gelöst. Vielleicht ist es zu spät, aber vielleicht hilft es jemandem. Mögliche Fehlerursache: Setzen von FLAG_NOT_FOCUSABLE bei LayoutParams

Fensterkennzeichen: Dieses Fenster wird niemals keine Tasten- oder andere Schaltflächenereignisse an es senden kann. Diese gehen stattdessen an das dahinter liegende fokussierbare Fenster.

Einfach austauschen FLAG_NOT_FOCUSABLE con 0

Verwenden Sie den folgenden Code:

InputMethodManager imm = null;

mView.findViewById(R.id.editText).setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){
                    if(imm==null){
                        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    }

                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0 );
                }
            }
        });

2. Bei der Erstellung von LayoutParametern

private WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                    0,
                    PixelFormat.TRANSLUCENT);

1voto

Vivek Bansal Punkte 1128

Ich stehe vor einem ähnlichen Problem. Aber in meinem Fall ist das Problem auf die Verwendung von WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE Flag bei der Erstellung von WindowManager.LayoutParams für die Ansicht.

Und für die Sichtbarkeit der Tastatur

InputMethodManager inputManager = (InputMethodManager) context.
                getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputManager != null) {
            inputManager.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
        }

-1voto

Neha Nathani Punkte 544

Wenn Sie die Soft-Tastatur bei Berührung des Edit-Textes anzeigen möchten, sollten Sie onTouchListener mit diesem Edit-Text verwenden. Ich glaube, edittext.requestfocus() wird dies auch tun. Wenn nicht, würde listener definitiv funktionieren.

Außerdem wäre es für die Art von Ansicht, die Sie erwähnen, am besten gewesen, Fragmente anstelle von Diensten zur Erstellung der Ansicht zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X