Come posso impostare lo stato attivo (e visualizzare la tastiera) sul mio EditText a livello di codice


180

Ho un layout che contiene alcune viste come questa:

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

Come posso impostare la messa a fuoco (visualizzare la tastiera) sul mio EditTextprogrammaticamente?

Ho provato questo e funziona solo quando lancio il mio Activitynormalmente, ma quando lo lancio in un TabHost, non funziona.

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


Risposte:


353

Prova questo:

EditText editText = (EditText) findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

http://developer.android.com/reference/android/view/View.html#requestFocus ()


Aggiornato con il codice per forzare la tastiera a mostrare da questa risposta: stackoverflow.com/questions/5105354/…
David Merriman

5
funziona solo quando lancio normalmente la mia attività, ma quando lancio la mia attività su un TabHost, non funziona,
Houcine

27
Questo non funziona. Questo funziona per me InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
Günay Gültekin,

5
"Questo non funziona fratello". In alcuni casi è necessario chiamare questo codice in modo asincrono da postDelayed (). Ho avuto un caso in cui ho dovuto aprire la tastiera dopo che l'utente ha premuto "OK" nella finestra di dialogo. E quando il dialogo si stava chiudendo, si stava incasinando l'attenzione. Quindi ho chiamato il codice sopra da postDelayed (). È stato eseguito dopo la chiusura del dialogo. Profitto.
Danylo Volokh,

2
237 voti positivi sulla risposta e 62 su "non funziona fratello" 🤔 L'ho provato per ottenere la mia opinione e funziona perfettamente!)
Daniel

165

uso:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

20
Dopo aver provato più di 5 altri approcci, questo è stato l'unico che ha funzionato per me (da una Viewsottoclasse)
William

13
Questo suggerimento porta alla correzione della tastiera, anche quando il campo perde la messa a fuoco.
fino al

2
sì, funziona anche per me e imm.showSoftInput()non funziona.
Spark.Bao

8
Mentre questo metodo funziona, ha un lato negativo, la chiusura dell'applicazione con il pulsante Home (hardware) lascerà la tastiera sullo schermo. Dovrai premere il pulsante di ritorno (hardware) per nascondere la tastiera, disprezzandola inutile nella schermata iniziale.
Adrien Horgnies,

Altri approcci non hanno funzionato per me, questo ha funzionato. grazie.
Iman Akbari,

53

Questo ha funzionato per me, grazie a ungalcrys

Mostra tastiera:

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

Nascondi tastiera:

InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2
L'unica soluzione completa. Grazie.
Korro,

41

showSoftInput non funzionava affatto per me.

Ho pensato di dover impostare la modalità di input: android:windowSoftInputMode="stateVisible"(qui nel componente Activity nel manifest)

Spero che questo aiuto!


5
Questo ha appena mostrato la tastiera all'avvio dell'attività.
William,

1
Fantastico :) Ho provato un sacco di risposte ma solo con questo, ho potuto farlo funzionare :) Grazie mille.
Srikanth,

risposta molto sottovalutata
Avinash R

Risposta perfetta Funziona solo con "editText.requestFocus ()". Grazie.
AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
Ho dovuto farlo per farlo apparire in onResume (). Senza il ritardo, non accadrebbe nulla usando ogni singola soluzione descritta in questo thread.
FranticRock,

1
Eccolo. Questa era la risposta che stavo cercando. Tuttavia, non è necessario un secondo intero ritardo. Ho provato solo 150 millis, e anche quello ha funzionato bene.
Rubberduck,

1
Grazie! Funziona anche per 0 ms ( tb.post({ showKeyboard(tb) })). Si noti che è necessaria una vista EditText ( tb), non una vista frammentata.
CoolMind

16

Ecco come è possibile creare un'estensione kotlin per mostrare e nascondere la tastiera soft:

fun View.showKeyboard() {
  this.requestFocus()
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

Quindi puoi semplicemente fare questo:

editText.showKeyboard()
// OR
editText.hideKeyboard()

questa è una soluzione migliore rispetto al riposo
d-feverx il

5

Raccomando di utilizzare un LifecycleObserver che fa parte della gestione dei cicli di vita con componenti Lifecycle-Aware di Android Jetpack .

Voglio aprire e chiudere la tastiera quando appare il frammento / attività. Innanzitutto, definire due funzioni di estensione per EditText. Puoi metterli ovunque nel tuo progetto:

fun EditText.showKeyboard() {
    requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

Quindi definire un LifecycleObserver che apre e chiude la tastiera quando l'attività / frammento raggiunge onResume()o onPause:

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

Quindi aggiungi la seguente riga a qualsiasi frammento / attività, puoi riutilizzare LifecycleObserver in qualsiasi momento. Ad esempio per un frammento:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

4

Ecco la classe KeyboardHelper per nascondere e mostrare la tastiera

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(final Context context, final View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}, 1000);
}

public static void hideSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}, 1000);
}


public static void openSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, 1000);
}
}

0

Primo modo :

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

Secondo modo :

In Manifest:

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

Nel codice:

etPassword.requestFocus();

0

Ho provato molti modi e non funziona, non sono sicuro perché sto usando la transizione condivisa dal frammento all'attività contenente il testo di modifica.

Tra l'altro il mio edittext è anche avvolto in LinearLayout.

Ho aggiunto un leggero ritardo per richiedere il focus e sotto il codice ha funzionato per me: (Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showKeyboard ()

 val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

Non sono riuscito a ottenere nessuna di queste risposte per funzionare da sola. La soluzione per me era combinarli:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
editText.requestFocus();
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

Non sono sicuro del motivo per cui è stato richiesto per me - secondo i documenti sembra che entrambi i metodi avrebbero dovuto funzionare da soli.


Questa non è sicuramente una buona pratica. Forse, la transazione Attività o Frammento stava intervenendo con la tastiera software o i flag Metodo di input non erano impostati correttamente ma in entrambi i casi, questa soluzione non dovrebbe essere utilizzata.
Marcel Bro
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.