Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cuando el teclado virtual aparece, hace que mi campo EditText pierda el foco

Tengo algunos campos de EditText en un ListView. Cuando toco en uno de los campos EditText, el teclado se desliza hacia la vista (como debería), pero el campo EditText que hice tapping pierde foco. He intentado usar varios métodos de InputMethodManager para hacer el teclado comenzar hacia fuera en la visión (para conseguir alrededor del problema algo que realmente lo solucione), pero eso no trabajó – el teclado no estaba en la visión cuando la actividad apareció.

El tipo de EditText es el number , y cuando el teclado se desliza, es un teclado numérico, pero cuando termina de deslizarse y el EditText pierde el foco, cambia al teclado alfabético (que refuerza la idea de que EditText ya no tiene foco) .

Mis preguntas son las siguientes:

1) ¿Cómo puedo hacer que la selección de mi campo EditText y el subsiguiente deslizamiento en el teclado no haga que mi EditText pierda el foco?

… fallando en eso…

2) ¿Cómo puedo hacer que el teclado empiece a la vista para que nunca tenga que deslizarse (evitando así el comportamiento que me parece tan objetable)?

Mi manifiesto incluye android:windowSoftInputMode="stateAlwaysVisible" , pero el teclado no aparece hasta que toque en un EditText. Este ignorar del atributo 'stateAlwaysVisible' parece que sólo ocurre en el emulador – en mi dispositivo provisto, es honrado por lo que la pregunta número 2 arriba funciona en el dispositivo … pero no en el emulador.

¡Gracias por cualquier ayuda que usted nos pueda proporcionar!

  • ¿Cómo puedo detectar el uso de tamaño de montón de una aplicación de Android?
  • Android app google maps mostrando azulejos grises y no mapa!
  • Configuración de la red del emulador de Android
  • ¿Por qué el emulador de Android informa "dispositivo virtual desconocido", cuando el dispositivo está en mi directorio de usuario?
  • Emulador: ADVERTENCIA: No se pudo inicializar la emulación de OpenGLES, utilizando software renderer
  • ¿Cómo obtener el número de compilación / versión de tu aplicación de Android?
  • Emulador de Android laggy en Mac
  • Cómo desarrollar una aplicación para Android que utilice Google Calendar API
  • 7 Solutions collect form web for “Cuando el teclado virtual aparece, hace que mi campo EditText pierda el foco”

    Aquí es cómo lo hice. El onFocusChangeListener() se llama varias veces cuando toca un EditText para escribir texto en él. La secuencia es:

    1. Si el foco estaba en una visión diferente, entonces esa vista pierde el foco
    2. El objetivo se centra en el objetivo
    3. El teclado suave aparece.
    4. Esto hace que el objetivo pierda foco
    5. El código detecta esta situación y llama a target.requestFocus ()
    6. La vista más a la izquierda y más alta gana foco, debido a las tonterías de Android
    7. La vista más a la izquierda pierde foco, debido a requestFocus que se llama
    8. Objetivo finalmente gana el foco

       ////////////////////////////////////////////////////////////////// private final int minDelta = 300; // threshold in ms private long focusTime = 0; // time of last touch private View focusTarget = null; View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean hasFocus) { long t = System.currentTimeMillis(); long delta = t - focusTime; if (hasFocus) { // gained focus if (delta > minDelta) { focusTime = t; focusTarget = view; } } else { // lost focus if (delta <= minDelta && view == focusTarget) { focusTarget.post(new Runnable() { // reset focus to target public void run() { focusTarget.requestFocus(); } }); } } } }; 

    El código anterior funciona bien para las ventanas emergentes del teclado. Sin embargo, no detecta el mensaje emergente de voz a texto.

    Necesitas cambiar en tu AndroidManifest.xml

    Añadir android: windowSoftInputMode = "adjustPan" en la actividad que contiene el listview. Esto resolverá su problema.

      <activity android:name=".MyEditTextInListView" android:label="@string/app_name" android:windowSoftInputMode="adjustPan"> 

    Saludos

    En mi caso, esto sucede porque cuando el ListView cambia de tamaño, vuelve a crear todos los elementos de la lista (es decir, llama a getView () de nuevo para cada elemento de lista visible).

    Debido a que el EditText está dentro del diseño que estoy regresando de getView (), esto significa que es una instancia diferente de EditText que el que tenía el foco anteriormente. Una consecuencia secundaria es que cuando el teclado virtual aparece o desaparece, descubrí que estaba perdiendo el contenido del EditText.

    Porque quería que mi vista permaneciera completamente accesible (es decir, quiero que se redimensione en lugar de ocultar detrás de la ventana del teclado con algunas partes no accesibles), no podría usar la respuesta de Frank, que de otra manera parece ser el mejor enfoque.

    Resolví esto usando un OnFocusChangeListener en el EditText para registrar la marca de tiempo cuando se perdió el foco y luego en getView () al recrear el elemento de lista, si la hora actual está dentro de un umbral desde cuando se perdió el foco, requestFocus ) Para devolverlo al EditText en cuestión.

    También puede tomar el texto de la instancia anterior del EditText en ese punto y transferirlo a la nueva instancia.

     private class MyAdapter<Type> extends ArrayAdapter<String> implements OnFocusChangeListener { private EditText mText; private long mTextLostFocusTimestamp; private LayoutInflater mLayoutInflater; public MyAdapter(Context context, int resource, int textResourceId, ArrayList<String> data, LayoutInflater li) { super(context, resource, textResourceId, data); mLayoutInflater = li; mTextLostFocusTimestamp = -1; } private void reclaimFocus(View v, long timestamp) { if (timestamp == -1) return; if ((System.currentTimeMillis() - timestamp) < 250) v.requestFocus(); } @Override public View getView (int position, View convertView, ViewGroup parent) { View v = mLayoutInflater.inflate(R.layout.mylayout, parent, false); EditText newText = (EditText) v.findViewById(R.id.email); if (mText != null) newText.setText(mText.getText()); mText = newText; mText.setOnFocusChangeListener(this); reclaimFocus(mText, mTextLostFocusTimestamp); return v; } @Override public void onFocusChange(View v, boolean hasFocus) { if ((v == mText) && !hasFocus) mTextLostFocusTimestamp = System.currentTimeMillis(); } } 

    Debe probar este código en un dispositivo con teclado de hardware siempre visible. El comportamiento también puede ocurrir aquí.

    Para evitar esto, puede tener el teclado siempre visible .. pero eso no es muy fácil como se puede ver por este hilo:

    https://groups.google.com/forum/#!topic/android-developers/FyENeEdmYC0

    Teóricamente, puede que tenga que crear su propio teclado Android (aunque utilizando como base el teclado Android de acciones) como se describe aquí: Android: ¿Cómo hacer que el teclado siempre sea visible?

    Este tipo tenía el mismo problema y más además. Lo resolvió usando un ScrollView y un LinearLayout en lugar de un ListView.

    Añadir android: windowSoftInputMode = "adjustResize" en la actividad que contiene el listview o EditText. Esto resolverá su problema.

     <activity android:name=".MainActivity" android:windowSoftInputMode="adjustResize"> </activity> 

    En AndroidManifest.xml use adjustNothing en la actividad que contiene las vistas

     <activity android:name=".ActivityName" android:windowSoftInputMode="adjustNothing"> 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.