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.


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?


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


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

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

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

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

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.


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


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

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.


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

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

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

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

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


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


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

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


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

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

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


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);
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.