Abrir el teclado virtual mediante programación

116

Tengo una actividad sin widgets secundarios y el archivo xml correspondiente es,

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

y quiero abrir el teclado en pantalla mediante programación mientras se inicia la actividad. y lo que he intentado hasta ahora es,

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

Dame alguna orientación.

Vignesh
fuente
hola vignesh, pero ¿cuál es la necesidad de abrir el teclado en pantalla sin ningún textView?
milind
En realidad, estoy tratando de usar el oyente clave en esa actividad, para eso necesito hacerlo.
Vignesh
Lo que has hecho es correcto. No estoy seguro de por qué no ve el teclado. Usé este código una vez para iniciar el teclado sin ninguna acción del usuario en un editText y fue exitoso.
Vinoth
Hola Vinoth, he cambiado mi código exactamente como las publicaciones de DSouza y también he actualizado mi pregunta, así que compruebe si hay algo que deba cambiar.
Vignesh

Respuestas:

145

He usado las siguientes líneas para mostrar el teclado virtual manualmente dentro del evento onclick, y el teclado está visible.

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

Pero todavía no puedo abrir esto mientras se abre la actividad, entonces, ¿hay alguna solución para esto?

Vignesh
fuente
@YosiTaguri, mucho más elegante si se trata de actividades. ¡¿Y los fragmentos ?! +1 para ambas respuestas
S.Thiongane
y ¿qué pasa si tiene que abrir el teclado en el cuadro de diálogo para editar texto? ¿Como hacer eso?
seema
5
@Vignesh: debe dar un retraso de 500 milisegundos al abrir el teclado si desea implementar este código en el momento de iniciar la actividad.
Vinit Saxena
@vinitsaxena Gracias por su valioso comentario
Vignesh
no estoy seguro, pero intenté obtener una vista, por ejemplo, TextView y agregar un oyente como este myTextView.post (new Runnable () {public void run () {// aquí su método}}); y cuando se cree esta vista, significa que toda la pantalla visible ahora puede llamar a lo que quiera
Aleksey Timoshchenko
121

En su archivo de manifiesto, intente agregar lo siguiente al <activity>que desea mostrar en el teclado cuando comience la actividad:

android:windowSoftInputMode="stateVisible"

Esto debería hacer que el teclado se vuelva visible cuando comience la actividad.

Para más opciones, consulte la documentación .

jemerick
fuente
3
Ojalá pudiera votar más a menudo por esta respuesta solo para que todos esos trucos sucios lleguen al final de la página;)
fjdumont
¿Cómo haces esto programáticamente? Solo quiero que el teclado se muestre automáticamente en determinadas situaciones.
phreakhead
1
tengo diálogo de entrada como este enlace enlace de cómo mostrar el teclado no en actividad, pero en rápida? esto funcionó gracias a <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef
7
Dice "programáticamente".
Mert Akcakaya
2
No me funciona. En cambio, esto lo hace: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya
34

Siga el siguiente código. Estoy seguro de que su problema se resolverá.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 
AndroidDanger
fuente
Hola, acabo de pegar tu código dentro de la función de creación, pero aún no hay cambios en mi actividad, si quieres que pegue el código, lo pegaré en el comentario.
Vignesh
Cuando desee acceder al teclado, dígame para que pueda resolver su problema. Por favor envíeme el código ... si es posible
AndroidDanger
Quiero establecer onKeyboardActionListener para mi actividad que no tiene nada más que un diseño lineal.
Vignesh
Solo vea mi pregunta anterior en la que he editado el código con lo que me ha proporcionado.
Vignesh
Esta actividad es solo para la acción del teclado, quiero escuchar cada tecla presionada (usando onKeyboardActionListener) y la pasaré al servidor local simultáneamente
Vignesh
25

Esto es funciona

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

o

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
ahtartam
fuente
2
Gracias por la forma programática de configurar esto, esto funciona, mientras que los hacks de InputMethodManager no.
Martin Vysny
17

Todo lo que necesitaba era exponer el teclado, en un momento muy preciso. ¡Esto funcionó para mí! Gracias Benites.

    private Handler mHandler= new Handler();

Y en el preciso momento:

    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
fuente
Esta solución funcionó para mí dentro de onResume () con una ligera modificación al retrasar la acción posterior: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper
1
Recomendaría ponerlo en una devolución de llamada de ViewTreeObserver para que se llame en el primer diseño para evitar tener que esperar una cantidad de tiempo arbitraria. Debería ser más seguro / más receptivo.
Gabriel
Solo esta solución funcionó para mí. Tenía métodos anteriores que funcionaron, pero desafortunadamente para el último sistema operativo, el controlador es la solución viable.
MD. Shafiul Alam Biplob
12

He usado las siguientes líneas para mostrar el teclado virtual manualmente dentro del 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);
        }
RAM
fuente
9

Pon eso en el método 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();
    }
});

el ejecutable es necesario porque cuando el sistema operativo activa el método onResume, no puede estar seguro de que todas las vistas se dibujaron, por lo que el método de publicación llamado desde su diseño raíz lo hace esperar hasta que cada vista esté lista.

Marcelo Benites
fuente
1
Tenía un SearchView en un DialogFragment y la primera vez que apareció el Dialog, SearchView tenía el foco ... pero el teclado NO estaba activo a menos que el usuario lo tocara. Intentamos usar showSoftInput y también toggleSoftInputFromWindow desde OnResume ALONE ... o incluso en OnFocusChangeListener para SearchView ... pero ninguno de ellos funcionó porque parecían dispararse antes de que la ventana se abriera y dibujara ..... .usar este evento de publicación en OnResume finalmente lo resolvió.
lepert
8

parece que esto está funcionando

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

parece que esto funciona mejor: en manifiesto:

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

Parece que el manifiesto funciona en Android 4.2.2 pero no en Android 4.0.3

Shimon Doodkin
fuente
8

en onCreate método de actividad o onActivityCreated de un fragmento

....
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
fuente
6

He utilizado así para mostrar el teclado en pantalla de forma programática y esto me funcionó para evitar el cambio de tamaño automático de la pantalla al iniciar el teclado.

En manifiesto:

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

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

Supongo que esto les ahorrará tiempo a otros para buscar este problema.

Sustantivo
fuente
Funciona, pero el teclado permanece visible incluso si sale de la aplicación, y una vez que cierra el teclado si abre de nuevo la aplicación, el teclado no aparece
nulll
No enfrenté este problema hasta ahora. Supongo que es un problema del dispositivo.
Noundla Sandeep
¿Por qué se necesita el temporizador? ¿Puedes agregar enlaces para profundizar?
nulo
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
fuente
3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
Kai Wang
fuente
3

Lo usé como singleton como:

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

Úselo en su actividad como:

showSoftKeyboard(this, yourEditTextToFocus);
Shylendra Madda
fuente
Muchas gracias por incluir un breve fragmento sobre cómo utilizar la función, así como la función en sí. ¡Funciona exactamente como lo necesitaba!
Chad Wilson
3

Esto funciona:

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

Y llamas a este método así:

showKeyboard(NameOfActivity.this);
Thiago Silva
fuente
2

InputMethodManager.SHOW_FORCED no es una buena opción. Si usa esta configuración, debe administrar el estado oculto del teclado. Mi sugerencia es así;

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

Además, puede centrarse en la vista (normalmente EditText) tomando los parámetros. Esto la convierte en una función más útil.

para obtener más información sobre InputMethodManager.SHOW_IMPLICIT y SHOW_FORCED; InputMethodManager

Cafer Mert Ceyhan
fuente
1

Este es el código fuente requerido:

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

Para obtener más información, acceda a este enlace. Eso me ayudó. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md

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

Use el código anterior en onResume () para abrir el teclado virtual

Sanket Parchande
fuente
1

Similar a la respuesta de @ShimonDoodkin, esto es lo que hice en un fragmento.

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

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

Donde ShowKeyboardesta

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

Después de una entrada exitosa, también me aseguro de ocultar el teclado

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);
EpicPandaForce
fuente
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
fuente
0

Ya hay demasiadas respuestas, pero nada funcionó para mí aparte de esto.

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

Usé showSoftInputconSHOW_FORCED

Y mi actividad tiene

 android:windowSoftInputMode="stateVisible|adjustResize"

Espero que esto ayude a alguien

mono espacial
fuente
0

Publique este método en su actividad base y utilícelo en otras actividades como un encanto

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