Öffnen Sie die Softtastatur programmgesteuert

115

Ich habe eine Aktivität ohne untergeordnete Widgets und die entsprechende XML-Datei lautet:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

und ich möchte die Softtastatur programmgesteuert öffnen, während die Aktivität beginnt. Und was ich bisher versucht habe, ist:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

Gib mir eine Anleitung.

Vignesh
quelle
Hallo Vignesh, aber was ist die Notwendigkeit, Soft-Tastatur ohne TextView zu öffnen?
Milind
Eigentlich versuche ich, Key Listener in dieser Aktivität zu verwenden, dafür muss ich das tun.
Vignesh
Was Sie getan haben, ist richtig. Ich bin mir nicht sicher, warum Sie die Tastatur nicht sehen. Ich habe diesen Code einmal verwendet, um die Tastatur ohne Benutzeraktion auf einem editText zu starten, und es war erfolgreich.
Vinoth
Hallo Vinoth, ich habe meinen Code genauso geändert wie DSouza-Beiträge und auch meine Frage aktualisiert. Überprüfen Sie also, ob ich etwas ändern muss.
Vignesh

Antworten:

145

Ich habe die folgenden Zeilen verwendet, um die Softtastatur manuell innerhalb des Onclick-Ereignisses anzuzeigen, und die Tastatur ist sichtbar.

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

Aber ich kann dies immer noch nicht öffnen, während die Aktivität geöffnet wird. Gibt es also eine Lösung dafür?

Vignesh
quelle
@ YosiTaguri, viel eleganter, wenn Sie mit Aktivitäten zu tun haben. Und was ist mit Fragmenten ?! +1 für beide Antworten
S.Thiongane
und was ist, wenn Sie die Tastatur in einem Dialogfeld öffnen müssen, in dem Text bearbeitet wird? Wie geht das?
scheinen
5
@Vignesh: Sie müssen beim Öffnen der Tastatur eine Verzögerung von etwa 500 Millisekunden angeben, wenn Sie diesen Code zum Zeitpunkt des Starts der Aktivität implementieren möchten.
Vinit Saxena
@vinitsaxena Vielen Dank für Ihren wertvollen Kommentar
Vignesh
Ich bin mir nicht sicher, aber ich habe versucht, eine Ansicht zu erhalten, zum Beispiel TextView, und einen Listener wie diesen anzuhängen. myTextView.post (new Runnable () {public void run () {// hier deine Methode}}); und wenn diese Ansicht erstellt wird, bedeutet dies, dass alle Bildschirme jetzt sichtbar sind, können Sie anrufen, was Sie wollen
Aleksey Timoshchenko
119

Fügen Sie in Ihrer Manifestdatei Folgendes zu dem hinzu <activity>, das Sie zu Beginn der Aktivität auf der Tastatur anzeigen möchten:

android:windowSoftInputMode="stateVisible"

Dies sollte dazu führen, dass die Tastatur sichtbar wird, wenn die Aktivität beginnt.

Weitere Optionen finden Sie in der Dokumentation .

jemerick
quelle
3
Ich wünschte, ich könnte öfter für diese Antwort stimmen, nur um all diese schmutzigen Hacks an den unteren Rand der Seite zu bringen;)
fjdumont
Wie machen Sie das programmatisch? Ich möchte nur, dass die Tastatur in bestimmten Situationen automatisch angezeigt wird.
Phreakhead
1
Ich habe Eingabedialog wie dieser Link Link wie Tastatur zu zeigen , nicht auf der Aktivität aber auf Aufforderung? Dies hat funktioniert, danke <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef
7
Er sagt "programmatisch".
Mert Akcakaya
2
Es funktioniert nicht bei mir. Stattdessen tut dies: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya
33

Bitte folgen Sie dem unten stehenden Code. Ich bin sicher, dass Ihr Problem gelöst wird.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 
AndroidDanger
quelle
Hallo, ich habe gerade Ihren Code in die onCreate-Funktion eingefügt, aber meine Aktivität hat sich nicht geändert. Wenn Sie möchten, dass ich den Code einfüge, füge ich einen Kommentar ein.
Vignesh
Wenn Sie auf das Softkeyboard zugreifen möchten, teilen Sie mir dies bitte mit, damit ich Ihr Problem lösen kann. Bitte senden Sie mir Code .... wenn möglich
AndroidDanger
Ich möchte onKeyboardActionListener für meine Aktivität festlegen, die nichts anderes als ein lineares Layout hat.
Vignesh
Sehen Sie sich einfach meine Frage oben an, in der ich den Code mit dem bearbeitet habe, was Sie für mich bereitgestellt haben.
Vignesh
Diese Aktivität ist nur für Tastaturaktionen gedacht. Ich möchte jede gedrückte Taste anhören (mit onKeyboardActionListener) und sie gleichzeitig an den lokalen Server weiterleiten
Vignesh
25

Das funktioniert

<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

oder

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Ahtartam
quelle
2
Vielen Dank für die programmatische Einstellung. Dies funktioniert, während die InputMethodManager-Hacks dies nicht tun.
Martin Vysny
17

Alles, was ich brauchte, war, die Tastatur in einem sehr präzisen Moment freizulegen. Das hat bei mir funktioniert! Danke Benites.

    private Handler mHandler= new Handler();

Und genau im Moment:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 
DiegoSoto
quelle
Diese Lösung funktionierte für mich in onResume () mit einer geringfügigen Änderung bei der Verzögerung der postDelayed( runnable, 500 /* msec */ );
Nachaktion
1
Ich würde empfehlen, es in einen ViewTreeObserver-Rückruf einzufügen, damit es beim ersten Layout aufgerufen wird, damit Sie nicht beliebig lange warten müssen. Es sollte sicherer / reaktionsfähiger sein.
Gabriel
Nur diese Lösung hat bei mir funktioniert. Ich hatte vorher Methoden, die funktionierten, aber leider für das neueste Betriebssystem. Der Handler ist die praktikable Lösung.
MD. Shafiul Alam Biplob
12

Ich habe die folgenden Zeilen verwendet, um die Softtastatur manuell innerhalb des Onclick-Ereignisses anzuzeigen.

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }
RAM
quelle
9

Fügen Sie das in die onResume-Methode ein:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

Die ausführbare Datei wird benötigt, da Sie beim Auslösen der onResume-Methode durch das Betriebssystem nicht sicher sein können, ob alle Ansichten gezeichnet wurden. Die von Ihrem Root-Layout aufgerufene Post-Methode lässt sie warten, bis alle Ansichten fertig sind.

Marcelo Benites
quelle
1
Ich hatte eine Suchansicht in einem DialogFragment und als der Dialog zum ersten Mal angezeigt wurde, hatte die Suchansicht den Fokus ... aber die Tastatur war NICHT aktiv, es sei denn, der Benutzer berührte sie. Wir hatten versucht, nur showSoftInput zu verwenden und auchSoftInputFromWindow aus dem OnResume ALONE oder sogar im OnFocusChangeListener für die Suchansicht umzuschalten ... aber keines davon funktionierte, weil sie zu feuern schienen, bevor das Fenster geöffnet und gezeichnet wurde ..... Die Verwendung dieses Post-Ereignisses im OnResume hat es endlich gelöst.
Lepert
8

scheint so zu funktionieren

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

scheint das besser zu funktionieren: im manifest:

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

scheint das Manifest in Android 4.2.2 zu funktionieren, aber nicht in Android 4.0.3

Shimon Doodkin
quelle
8

in onCreate Aktivitätsmethode oder onActivityCreated eines Fragments

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });
Alex
quelle
6

Ich habe dies verwendet, um die Softtastatur programmgesteuert anzuzeigen, und dies funktioniert für mich, um die automatische Größenänderung des Bildschirms beim Starten der Tastatur zu verhindern.

Im Manifest:

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

In XXXActvity:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

Ich gehe davon aus, dass dies anderen Zeit spart, um nach diesem Problem zu suchen.

Noundla Sandeep
quelle
Funktioniert, aber die Tastatur bleibt auch dann sichtbar, wenn Sie die App
beenden.
Ich hatte dieses Problem bis jetzt nicht. Ich gehe davon aus, dass es sich um ein Geräteproblem handelt.
Noundla Sandeep
Warum wird der Timer benötigt? Können Sie Links hinzufügen, um tiefer zu gehen?
Uhr
6

Kotlin

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Java

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
Khemraj
quelle
3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
Kai Wang
quelle
3

Ich habe es als Singleton benutzt wie:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Verwenden Sie es in Ihrer Aktivität wie:

showSoftKeyboard(this, yourEditTextToFocus);
Shylendra Madda
quelle
Vielen Dank, dass Sie einen kurzen Ausschnitt zur Verwendung der Funktion sowie der Funktion selbst beigefügt haben. Es funktioniert genau so, wie ich es brauchte!
Chad Wilson
3

Das funktioniert:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

Und Sie nennen diese Methode so:

showKeyboard(NameOfActivity.this);
Thiago Silva
quelle
2

InputMethodManager.SHOW_FORCED ist keine gute Wahl. Wenn Sie diese Einstellung verwenden, sollten Sie das Ausblenden des Tastaturstatus verwalten. Mein Vorschlag ist so;

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

Sie können sich auch auf die Ansicht konzentrieren (normalerweise EditText) und Parameter verwenden. Dies macht es zu einer nützlicheren Funktion

Weitere Informationen zu InputMethodManager.SHOW_IMPLICIT und SHOW_FORCED. InputMethodManager

Cafer Mert Ceyhan
quelle
1

Dies ist der erforderliche Quellcode:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

Für Details gehen Sie bitte über diesen Link. Das hat mir geholfen. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md

Nikhil Losalka
quelle
1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Verwenden Sie den obigen Code in onResume (), um die Soft-Tastatur zu öffnen

Sanket Parchande
quelle
1

Ähnlich wie bei der Antwort von @ShimonDoodkin habe ich dies in einem Fragment getan.

https://stackoverflow.com/a/29229865/2413303

    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.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);
EpicPandaForce
quelle
1
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
Arsen
quelle
0

Es gibt bereits zu viele Antworten, aber ansonsten hat nichts für mich funktioniert

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

Ich habe showSoftInputmit verwendetSHOW_FORCED

Und meine Tätigkeit hat

 android:windowSoftInputMode="stateVisible|adjustResize"

hoffe das hilft jemandem

spaceMonkey
quelle
0

Veröffentlichen Sie diese Methode in Ihrer Basisaktivität und verwenden Sie sie für andere Aktivitäten wie einen Zauber

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
Ajay Chauhan
quelle