Cómo mostrar el teclado virtual cuando edittext está enfocado

461

Quiero mostrar automáticamente el teclado virtual cuando un EditTextfoco está enfocado (si el dispositivo no tiene un teclado físico) y tengo dos problemas:

  1. Cuando Activityse muestra my, mi EditTextestá enfocado pero el teclado no se muestra, necesito hacer clic nuevamente para mostrar el teclado (debe mostrarse cuando Activityse muestra my ).

  2. Y cuando hago clic en Listo en el teclado, el teclado se descarta pero EditTextpermanece enfocado y no quiero (porque mi edición está hecha).

Para resumir, mi problema es tener algo más parecido al iPhone: que mantiene la sincronización del teclado con mi EditTextestado (enfocado / no enfocado) y, por supuesto, no presenta un teclado virtual si hay uno físico.

Ludovic Landry
fuente
Solo tengo un EditText básico como: <EditText android: id = "@ + id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: imeOptions = "actionDone" /> Y en mi actividad tengo esto: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Ludovic Landry
2
Esto me ayudó mejor que cualquier respuesta en esta publicación: stackoverflow.com/a/2418314/1491212
Armel Larcier

Respuestas:

629

Para forzar la aparición del teclado virtual, puede usar

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

Y para eliminar el enfoque EditText, lamentablemente necesita tener un maniquí Viewpara enfocar.

espero que esto ayude


Para cerrarlo puedes usar

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Esto funciona para usarlo en un diálogo

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}
raukodraug
fuente
2
Si hago esto, el teclado virtual se muestra cuando aparece la actividad (es bueno) pero cuando mi enfoque deja el EditText y va a un Botón, por ejemplo, el teclado permanece (eso es malo).
Ludovic Landry
157
No me funciona con un EditText en un diálogo que ya tiene foco. No estoy seguro de por qué.
Matthias
10
@AbdellahBenhammou, tal vez haciendo una solicitud de llamada de enfoque en su texto de edición antes de mostrar la entrada suave podría resolver su problema. Lo hizo por mi.
r1k0
18
@AbdellahBenhammou, haga esto en onCreate (): getDialog (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) de su DialogFragment;
Phillip
22
Trabajó solo junto con yourEditText.requestFocus()lo descrito aquí: stackoverflow.com/questions/8991522/…
Vivek Pandey
231

Yo tuve el mismo problema. Inmediatamente después de que editText VISIBILITY cambiara de GONE a VISIBLE, tuve que establecer el enfoque y mostrar el teclado virtual. Lo logré usando el siguiente código:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Funciona para mí con un retraso de 100 ms, pero falló sin demora o solo con un retraso de 1 ms.

La parte comentada del código muestra otro enfoque, que funciona solo en algunos dispositivos. Probé en las versiones del sistema operativo 2.2 (emulador), 2.2.1 (dispositivo real) y 1.6 (emulador).

Este enfoque me ahorró mucho dolor.

Mike Keskinov
fuente
48
No sabía que algo pudiera ser tan feo y tan hermoso al mismo tiempo. Muchas gracias!
mkerley
15
@ medusa esto simula un toque en el EditText. Para otros que lean esto, en lugar de crear uno nuevo Handler, también podrían usar el View.postDelayed()método en el yourEditTextwidget.
Tony Chan
55
Este es un truco, una solución mucho mejor de David Chandler.
Ben Bederson
44
Si la solución de David Chandler funciona en todas las versiones / dispositivos Android y para el caso en que la VISIBILIDAD se cambió de GONE a VISIBLE, entonces SÍ, debería usar su solución en su lugar.
Mike Keskinov
3
Convenido. ¿Conoces una mejor solución que funcione en todos los sabores de Android?
Mike Keskinov
162

Para que aparezca el teclado, use

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

Este método es más confiable que invocar directamente InputMethodManager.

Para cerrarlo, use

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
David Chandler
fuente
12
¿Alguien puede explicar por qué esto es más confiable que invocar directamente InputMethodManager? (Por un lado, no funciona, a diferencia de la solución de raukodraug.)
Matthew Quiros
55
A mí tampoco me funciona. Trabajando en Android 2.3.5. La solución de raukodraug funciona para mí. Busqué la dependencia de la versión pero no pude encontrar una.
Hugo Logmans
2
Esto funcionó para mí en Android 4.4.2. El método InputMethodManager elegido como la solución para esta publicación no funcionó para mí.
Phil
después de usar el método en la respuesta, agregué esto y funcionó, pero sin él no funcionó. gracias
Manny265
2
No funcionó para mí en Android 4.4.2. Muestra el teclado pero no lo ocultó.
John J Smith
87

Cuando nada más funciona, obliga a que se muestre :

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

Y luego, si desea cerrarlo, en onPause (), por ejemplo, puede llamar a:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Bolling
fuente
44
¡Tenías razón, @Bolling! Cuando nada más funcionó, su código me salvó. ¡Gracias!
Willian Paixao
3
¡Tu código fue el único que trabajó para mí, y probé todas las soluciones en esta página! ¡Muchas gracias!
Mattia Ruggiero
44
No lo fuerces. en algunos casos, cuando pasa de primer plano a segundo plano, el teclado permanecerá allí porque lo forzó. Es un problema de fragmentación, pero lo he visto en Samsung Duos.
j2emanue
Por lo general, siempre tengo código para cerrar el teclado en Pausa () ya que he visto que se atasca incluso si no lo forzaste.
Bolling
Eso funcionó, pero cuando se mueve a las otras pantallas, todavía permanece abierto
Sithu
75

El siguiente código es sacado del código fuente 4.1 de Google para SearchView. Parece funcionar, bien en versiones menores de Android también.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Luego, además, se debe agregar el siguiente código a medida que se crea Control / Activity. (En mi caso, es un control compuesto, en lugar de una actividad).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});
Robin Davies
fuente
¡Gracias! Funciona asombrosamente bien. Y es la solución con la que me siento más cómodo con todas las respuestas y temas que he estado leyendo sobre este tema.
Rui
37
:-D setImeVisibility(hasFocus)?
Matthias
Probé este método ya que en realidad estaba "rodando mi propia vista de búsqueda" (no quería tener que hacerlo, pero había razones). Esto funcionó para mí, excepto en el lanzamiento de la actividad. Agregué android: windowSoftInputMode = "alwaysVisible" a la actividad y ya había llamado a requestFocus () en el texto de edición. Funciona como un campeón.
javahead76
¿Alguna idea de la necesidad de removeCallbacks (mShowImeRunnable)? Pensé que una vez que el ejecutable se selecciona para ejecutarse desde la cola, ¿también se eliminará de la cola al mismo tiempo?
Cheok Yan Cheng
1
Después de probar varias variaciones, esta fue la única que funcionó de manera consistente para mí (Android 4.42). Thx
John J Smith
34

android:windowSoftInputMode="stateAlwaysVisible" -> en archivo de manifiesto.

edittext.requestFocus(); -> en código.

Esto abrirá un teclado virtual en el que editar texto tiene el foco de solicitud a medida que aparece la actividad.

gorenikhil33
fuente
2
Esto abre el teclado en la creación de Actividad.
xpto
no responde la pregunta, pero me ayudó :)
S.Thiongane
abre la clave sin solicitar enfoque en la api 22
David
Funciona bien para mi caso. ¡Me pregunto por qué también es necesario mencionar el atributo de enfoque de solicitud solo desde el xml manifest!
sud007
30

He tenido algo de suerte reciente en algunos casos simples con el código a continuación. No he terminado todas las pruebas pero ...

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Y presto aparece el teclado.

Abolladura
fuente
Para mi caso, tenía un botón para agregar información opcional. En el controlador button.onClick, se agregó el código anterior para forzar que el teclado virtual aparezca para la entrada de la información opcional. Droid 2.2.2
Dent
Esta es una buena solución, pero no olvide que debe crear un objeto MotionEvent y llamar a recycle () después de su uso, para ser reutilizado por un llamador posterior.
jimbob
Solo necesita un dispatchTouchEvent () con ACTION_UP como argumento ..
Mohammed Junaid
15

Puedes intentar forzar la aparición del teclado virtual, funciona para mí:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Vadim Zin4uk
fuente
1
Esto funciona para mí ... He intentado estos InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (nombre, inputMethodManager.SHOW_IMPLICIT); o getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); pero ninguno de ellos estaba trabajando.
Günay Gültekin
10

A veces la respuesta de raukodraug no funciona. Lo hice de esta manera con algunas pruebas y errores:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

Y la parte EditText :

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });
Xieyi
fuente
1
Esta es la única solución que funcionó para mí en Android 5
user1021430
10

Para ocultar el teclado, use este:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

y para mostrar el teclado:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Mubashar
fuente
Para un DialogFragment, puede llamar a esto de forma anulada onStart(), y puede usarlo getDialog().getWindow()como una alternativa a getActivity().getWindow().
Mr-IDE
10

Y para Kotlin solo use estas extensiones:

fun EditText.showKeyboard() {
    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)
}
bitvale
fuente
justo lo que estaba buscando.
lasec0203
8

Por fragmento, seguro que está funcionando:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Arish Khan
fuente
7

showSoftInput no estaba funcionando para mí en absoluto.

Pensé que necesitaba establecer el modo de entrada: (aquí en el componente Actividad en el manifiesto)

android:windowSoftInputMode="stateVisible" 
vincebodi
fuente
6

Creer o no mi problema con Soft Keyboard se resolvió cuando descubrí que las animaciones de Actividades pueden deshabilitar el Soft Keyboard. Cuando llamas a la intención con el

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

y

overridePendingTransition(0, 0);

Puede ocultar el teclado suave y no hay forma de mostrarlo.

chispa
fuente
6

Tuve el mismo problema en varias situaciones diferentes, y las soluciones que encontré funcionan en algunas, pero no funcionan en otras, así que aquí hay una solución combinada que funciona en la mayoría de las situaciones que he encontrado:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}
n0sferat0k
fuente
6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});
Invitado
fuente
6

Combiné todo aquí y para mí funciona:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
lxknvlk
fuente
6

Funcionó para mi. Puedes probar con esto también para mostrar el teclado:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Rayo Tarit
fuente
5

fragmento de código . . .

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}
Jongz Puangput
fuente
5

Kotlin extensión para mostrar el teclado en foco.

Esta es una combinación de respuestas anteriores, que eran demasiado largas o incompletas.

Esta extensión publica un ejecutable en la cola de mensajes que muestra el teclado virtual después de solicitar el foco:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

Llámalo desde cualquier vista cuando sea necesario después:

editText.showSoftKeyboard()
Alex Burdusel
fuente
4

simplemente agregue android: windowSoftInputMode = "stateHidden" en el archivo de manifiesto ...

Prakash Gavade
fuente
4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
XXX
fuente
4

Dentro de tu manifiesto:

android:windowSoftInputMode="stateAlwaysVisible"- Teclado lanzado inicialmente. android:windowSoftInputMode="stateAlwaysHidden" - Teclado inicialmente oculto.

También me gusta usarlo "adjustPan"porque cuando se inicia el teclado, la pantalla se ajusta automáticamente.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
Md Imran Choudhury
fuente
4

Simplemente agregue esta línea en su vista EditText:

android:isScrollContainer="true"

y TADA: ¡el teclado comenzó a aparecer automáticamente!

Tuve un problema similar y descubrí esta solución simple y extraña.

Como ya se mencionó aquí por el usuario 3392439, la apariencia del teclado al enfocarse de alguna manera extrañamente conectada con la presencia del componente de desplazamiento en el archivo XML.

Incluso la presencia de otra vista EditText que comprende la línea mencionada anteriormente en el mismo XML hace que el teclado aparezca sin importar cuál de EditTexts esté enfocado actualmente.

Si tiene al menos una vista visible que comprende un componente de desplazamiento en su archivo XML, el teclado aparecerá automáticamente en foco.

Si no hay desplazamiento, debe hacer clic en Editar texto para que aparezca el teclado.

Waldmann
fuente
Esto es muy extraño, pero definitivamente las obras - yo estaba tratando requesFocus()desde un controlador de clic y esta es la única manera de que no sea una explícita showSoftInput SHOW_FORCED
dibujó
Santo cielo, gracias hombre. No tengo idea de por qué funciona, pero lo he probado en 8 dispositivos de diferentes fabricantes y funcionó todo el tiempo.
Antonio Vlasic
3

Todas las soluciones dadas anteriormente (la interacción InputMethodManager en OnFocusChangeListener.onFocusChange oyente adjunto a su EditText funciona bien si tiene edición única en la actividad.

En mi caso tengo dos ediciones.

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

He observado que onFocusChange se activa para tvX con hasFocus = true (se muestra el teclado) pero luego para tvY con hasFocus = true (teclado oculto). Al final, no se veía ningún teclado.

La solución general debe tener una declaración correcta en if "show keyboard if EditText text is focus"

Bartosz Bilicki
fuente
3

En su sección onResume () de la Actividad, puede llamar al método bringKeyboard ();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }
Vikas
fuente
¿Qué es el WidgetUtils.showKeyboard? Esa es la parte más importante aquí.
TWiStErRob
2

Ninguna de las respuestas funcionó para mí. Aquí hay una manera simple.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

Solo retrasé el método requestFocus () durante 400 ms.

Satyajit Das
fuente
Muchas gracias, necesita algo de retraso para que el teclado muestre ...
hkh114
1

Descubrí un comportamiento extraño, ya que en una de mis aplicaciones, el teclado virtual se mostraba automáticamente al ingresar a la actividad (hay un editText.requestFocus () en onCreate).

Al investigar más, descubrí que esto se debía a que hay un ScrollView alrededor del diseño. Si elimino el ScrollView, el comportamiento es como se describe en la declaración del problema original: solo al hacer clic en editText ya enfocado aparece el teclado virtual.

Si no funciona para usted, intente poner un ScrollView, de todos modos es inofensivo.

usuario3392439
fuente
1

Tuve un problema similar al usar animaciones de vista . Así que puse un oyente de animación para asegurarme de que esperaría a que terminara la animación antes de intentar solicitar un acceso de teclado en el texto de edición que se muestra.

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });
Benjamin Piette
fuente
1

Estoy de acuerdo con el raukodraug para usarlo en una vista rápida, debe solicitar / enfocar de esta manera:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

Saludos.

Jean-Luc Barat
fuente