Aprire la tastiera virtuale a livello di programmazione


116

Ho un'attività senza widget figlio e il file xml corrispondente è,

<?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>

e voglio aprire la tastiera virtuale a livello di programmazione mentre inizia l'attività. e quello che ho provato fino ad ora è,

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);
    }

Dammi una guida.


ciao vignesh ma qual è la necessità di aprire la tastiera virtuale senza alcun textView?
milind

In realtà sto cercando di utilizzare l'ascoltatore chiave in quell'attività, per questo ho bisogno di farlo.
Vignesh

Quello che hai fatto è corretto. Non sono sicuro del motivo per cui non vedi la tastiera. Ho usato questo codice una volta per avviare la tastiera senza alcuna azione da parte dell'utente su un editText e ha avuto successo.
Vinoth

Ciao Vinoth, ho cambiato il mio codice esattamente come i post di DSouza e ho aggiornato anche la mia domanda, quindi controlla se c'è qualcosa che devo cambiare.
Vignesh

Risposte:


145

Ho usato le seguenti righe per visualizzare manualmente la tastiera virtuale all'interno dell'evento onclick e la tastiera è visibile.

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

Ma non riesco ancora ad aprirlo mentre l'attività è aperta, quindi c'è qualche soluzione per questo?


@YosiTaguri, molto più elegante se hai a che fare con le attività. E i frammenti ?! +1 per entrambe le risposte
S. Thiongane

e cosa succede se devi aprire la tastiera nella finestra di dialogo con la modifica del testo? Come farlo?
sembra

5
@Vignesh: devi dare un po 'di ritardo come 500 millisecondi durante l'apertura della tastiera se vuoi implementare questo codice al momento del lancio dell'attività.
Vinit Saxena

@vinitsaxena Grazie per il tuo prezioso commento
Vignesh

non ne sono sicuro, ma stavo cercando di ottenere una vista per esempio TextView e aggiungere listener come questo myTextView.post (new Runnable () {public void run () {// here your method}}); e quando questa visualizzazione verrà creata significa che tutto lo schermo è visibile ora puoi chiamare quello che vuoi
Aleksey Timoshchenko

121

Nel tuo file manifest, prova ad aggiungere quanto segue a <activity>quello che desideri mostrare sulla tastiera quando inizia l'attività:

android:windowSoftInputMode="stateVisible"

Questo dovrebbe rendere visibile la tastiera quando inizia l'attività.

Per ulteriori opzioni, controlla la documentazione .


3
Vorrei poter votare più spesso per questa risposta solo per portare tutti quegli sporchi hack in fondo alla pagina;)
fjdumont

Come lo fai in modo programmatico? Voglio che la tastiera venga visualizzata automaticamente solo in determinate situazioni.
phreakhead

1
ho finestra di input come questo link collegamento come mostrare la tastiera non in attività, ma il tempestivo? questo ha funzionato grazie a <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef

7
Dice "programmaticamente".
Mert Akcakaya

2
Non funziona per me. Invece, questo fa: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya

34

Si prega di seguire il codice sottostante. Sono sicuro che il tuo problema sarà risolto.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

Ciao ho appena incollato il tuo codice all'interno della funzione onCreate ma ancora non ci sono cambiamenti nella mia attività, se vuoi che incolli il codice, lo incollerò nel commento.
Vignesh

Quando vuoi accedere alla softkey, dimmelo in modo da risolvere il tuo problema. Inviami il codice .... se possibile
AndroidDanger

Voglio impostare onKeyboardActionListener per la mia attività che non ha altro che layout lineare.
Vignesh

Basta vedere la mia domanda sopra in cui ho modificato il codice con quello che mi hai fornito.
Vignesh

Questa attività è solo per l'azione della tastiera, voglio ascoltare ogni tasto premuto (usando onKeyboardActionListener) e lo passerò al server locale contemporaneamente
Vignesh

25

Questo funziona

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

o

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

2
Grazie per il modo programmatico di impostarlo: funziona, mentre gli hack InputMethodManager no.
Martin Vysny

17

Tutto ciò di cui avevo bisogno era esporre la tastiera, in un momento molto preciso. Questo ha funzionato per me! Grazie Benites.

    private Handler mHandler= new Handler();

E nel momento molto preciso:

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

Questa soluzione ha funzionato per me all'interno di onResume () con una leggera modifica per ritardare l'azione post: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
Consiglierei di metterlo in un callback ViewTreeObserver in modo che venga chiamato sul primo layout per evitare di dover attendere un periodo di tempo arbitrario. Dovrebbe essere più sicuro / più reattivo.
Gabriel

Solo questa soluzione ha funzionato per me. Avevo metodi precedenti prima che funzionassero, ma sfortunatamente per l'ultimo sistema operativo, il gestore è la soluzione praticabile.
MD. Shafiul Alam Biplob

12

Ho usato le seguenti righe per visualizzare manualmente la tastiera virtuale all'interno dell'evento onclick.

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);
        }

9

Mettilo nel metodo onResume:

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();
    }
});

il runnable è necessario perché quando il sistema operativo attiva il metodo onResume non puoi essere sicuro che tutte le viste siano disegnate, quindi il metodo post chiamato dal tuo layout di root lo fa aspettare finché ogni vista è pronta.


1
Avevo un SearchView in un DialogFragment e la prima volta che il Dialog è apparso il SearchView era attivo ... ma la tastiera NON era attiva a meno che l'utente non la toccasse. Abbiamo provato a usare solo showSoftInput e anche toggleSoftInputFromWindow da OnResume ALONE ... o anche in OnFocusChangeListener per SearchView ... ma nessuno di questi ha funzionato perché sembrava che si attivasse prima che la finestra fosse aperta e disegnata ..... L'utilizzo di questo evento post in OnResume lo ha finalmente risolto.
lepert

8

sembra che funzioni

 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();
    }

sembra che funzioni meglio: in 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>

sembra che il manifest funzioni in Android 4.2.2 ma non funziona in Android 4.0.3


8

in onCreate metodo di attività o onActivityCreated di un frammento

....
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;
        }
    });

6

L'ho usato in questo modo per mostrare la tastiera morbida in modo programmatico e questo ha funzionato per me per impedire il ridimensionamento automatico dello schermo durante l'avvio della tastiera.

In manifesto:

<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);

Presumo che questo farà risparmiare tempo ad altri per cercare questo problema.


Funziona, ma la tastiera rimane visibile anche se esci dall'app, e una volta chiusa la tastiera se apri di nuovo l'app, la tastiera non appare
nulll

Non ho affrontato questo problema fino ad ora. Presumo che sia un problema del dispositivo.
Noundla Sandeep

Perché è necessario il timer? Puoi aggiungere link per approfondire?
nulll

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)
}

Giava

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);
}

3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

3

L'ho usato come singleton come:

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();
        }
    }

Usalo nella tua attività come:

showSoftKeyboard(this, yourEditTextToFocus);

Grazie mille per aver incluso un breve snippet su come utilizzare la funzione e la funzione stessa. Funziona esattamente come ne avevo bisogno!
Chad Wilson,

3

Funziona:

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);
}

E chiami questo metodo in questo modo:

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED non è una buona scelta. Se usi questa impostazione dovresti gestire lo stato di nascondere la tastiera. Il mio suggerimento è così;

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

Inoltre, puoi concentrarti sulla visualizzazione (di solito EditText) prendendo i parametri. Questo lo rende una funzione più utile

per maggiori informazioni su InputMethodManager.SHOW_IMPLICIT e SHOW_FORCED; InputMethodManager


1

Questo è il codice sorgente richiesto:

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);}

Per i dettagli, passare a questo collegamento. Questo mi ha aiutato. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


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

Usa il codice sopra in onResume () per aprire la tastiera virtuale


1

Simile alla risposta di @ShimonDoodkin, questo è quello che ho fatto in un frammento.

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

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

dove ShowKeyboardsi trova

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);
    }
}

Dopo un input riuscito, mi assicuro anche di nascondere la tastiera

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

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);
        }
    }
}

0

Ci sono già troppe risposte ma niente ha funzionato per me a parte questo

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

Ho usato showSoftInputconSHOW_FORCED

E la mia attività sì

 android:windowSoftInputMode="stateVisible|adjustResize"

spero che questo aiuti qualcuno


0

Pubblica questo metodo nella tua attività di base e usalo in altre attività come un incantesimo

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.