2011-06-16 15 views
12

Tengo una actividad que muestra algunos EditTexts en la pantalla para la entrada del usuario. Para estar seguro de que el teclado virtual no cubre mis campos cuando se muestra He establecido la propiedadAndroid: Ventana emergente de error en EditText no se mueve hacia abajo cuando el teclado se va

android:windowSoftInputMode="adjustPan" 

para mi Actividad en el manifiesto. Estoy validando el contenido de EditText cuando 1. La vista pierde el foco 2. Cuando el usuario realiza la acción 'Enter'. Tras la validación, si el valor no es válido Estoy llamando

setError(CharSequence error) 

en el EditarTexto, lo que provoca una emergente para mostrar que contiene el error que se ha pasado. El problema es que si la EditarTexto se mueve hacia arriba cuando las pantallas de teclado virtual , y la ventana emergente se muestra en ese momento (la validación ha fallado), la ventana emergente no sigue el EditText hacia abajo cuando el teclado se va, se queda donde se mostró por primera vez.

¿Alguna idea sobre cómo solucionar esto? ¿Es esto un error en Android?

Respuesta

10

Si esto es como usted lo describió, creo que esto puede ser un error genuino, por lo que puede valer la pena escribirlo en el Android Source site.

¡Así que evidentemente solo puedo pensar en hackear el entorno!

de anulación cuando el keyboard disappears:

public boolean onKeyPreIme(int keyCode, KeyEvent event) { 
if (keyCode == KeyEvent.KEYCODE_BACK && 
    event.getAction() == KeyEvent.ACTION_UP) { 
     revalidateEditText(); 
     return false; 
} 
return super.dispatchKeyEvent(event); 
} 

public void revalidateEditText(){ 
     // Dismiss your origial error dialog   
     setError(null); 
     // figure out which EditText it is, you already have this code 
     // call your validator like in the Q 
     validate(editText); // or whatever your equivalent is 
} 

Este revalidará su EditarTexto, desestimar su diálogo de error y volver a mostrarlo.

¿Cómo suena eso?

Inspirado por: Get back key event on EditText

+1

Esto no funciona para mí. Cuando el teclado suave está activo, mi EditText está sobre el teclado, y también lo está el mensaje de error. Cuando el teclado desaparece, EditText se mueve hacia abajo y el mensaje sigue donde se visualizó originalmente.Necesito revalidar DESPUÉS de que el teclado desaparezca, y EditText se haya movido a su nueva posición. –

+0

Puede ocultar el teclado usted mismo http://stackoverflow.com/questions/1109022/how-to-close-hide-the-android-soft-keyboard y luego revalidateEditText(); – Blundell

0

has necesitado validar su punto de vista, es decir, llamando a invalidar el método() de la vista.

tratar editText.invalidate();

Gracias.

+0

Intenté esto y no funcionó. – Sadegh

1

Para mí, ayudó a envolver el diseño en un ScrollView. Después de esto, todo el desplazamiento del setError-box funcionó bien.

2

También puede personalizar tu EditarTexto y método de reemplazo onKeyPreIme (int keyCode, evento KeyEvent)

@Override 
public boolean onKeyPreIme(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { 
     clearFocus(); 
     return false; 
    } 
} 
0

he encontrado el la SOLUTION!

Aquí está el código:

import android.content.Context; 
import android.os.Handler; 
import android.support.v7.widget.AppCompatEditText; 
import android.util.AttributeSet; 
import android.view.KeyEvent; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.inputmethod.InputMethodManager; 

/** 
* Created by Jaume Colom Ferrer on 14/12/2015 
*/ 
public class EditTextPopUpFixed extends AppCompatEditText { 

    private static final int TIME_SLEEP = 500; 

    private Context ctx; 
    private EditTextListener mListener; 
    private int backTimes = 0; 

    public EditTextPopUpFixed(Context context) { 
     super(context); 
     ctx = context; 
    } 

    public EditTextPopUpFixed(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     ctx = context; 
    } 

    public EditTextPopUpFixed(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     ctx = context; 
    } 

    public void setEditTextListener(EditTextListener lis) { 
     mListener = lis; 

     this.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 

       backTimes = 0; 
       return false; 
      } 
     }); 
    } 

    @Override 
    public boolean onKeyPreIme(int keyCode, KeyEvent event) { 

     if (keyCode == KeyEvent.KEYCODE_BACK) 
      backTimes++; 

     if (backTimes == 3) { 
      backTimes = 0; 
      mListener.close(); 
      return true; 
     } 

     if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ENTER) { 
      InputMethodManager mgr = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
      if (mgr.isActive()) { 
       mgr.hideSoftInputFromWindow(this.getWindowToken(), 0); 
       boolean mustRevalidate = getError() != null; 
       setError(null); 
       if (mListener != null && mustRevalidate) { 
        Handler han = new Handler(); 
        han.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          mListener.revalidateEditText(); 
         } 
        }, TIME_SLEEP); 
       } 
      } else { 
       backTimes = 0; 
       super.onKeyPreIme(keyCode, event); 
      } 
      return true; 
     } 
     return false; 
    } 

    public interface EditTextListener { 
     void revalidateEditText(); //Revalidates the EditText to refresh the Popup (Must revalidate the EditText in its implementation) 

     void close(); // Method to close the activity or fragment (Must finish activity or go back in its implementation) 
    } 
} 

Puedes usar este Custom EditText para resolver este error. Actualiza el error, después de abrir/cerrar el teclado, y su ventana emergente siempre se mostrará correctamente.

Debe implementar close (finalizar o onBackPressed) y revalidar los métodos de edición de texto en su clase.

+0

Por favor, agregue su solución en la respuesta. Los enlaces pueden salir de la modalidad. – CuriousSuperhero

+1

Ok, editado. Gracias –

Cuestiones relacionadas