2010-12-23 16 views
5

Me he estado rascando la cabeza todo el día por esto. en una de mis actividades (y solo una) cuando abro el teclado virtual, aparece el asa del cajón deslizante encima. Logré solucionar este problema en todas las demás actividades de mi aplicación colocando android: windowSoftInputMode = "adjustPan" en cada actividad en mi archivo Manafest.xml, incluida la actividad en cuestión. también, en la medida en que he podido determinar que ninguno de los objetos de la actividad tiene foco (si es que uno no puedo encontrar la manera de encontrarlo). Comprobé el foco utilizando this.getCurrentFocus() y luego haciendo view.clearFocus() en la vista devuelta si había uno. hasta el momento no ha devuelto una vista, por lo que puedo decir, nada tiene foco.cómo mantener el cajón deslizante sobre la parte superior del teclado virtual

¿Alguna idea?

+1

me encontré con el mismo problema y encontré su pregunta como primer resultado. Si obtuvo una solución de trabajo, siéntase libre de publicarla a continuación. – keyboardsurfer

Respuesta

0

Esta es mi solución ... en la actividad que contiene EditText tengo una subclase que se extiende EditText. En esta subclase, anulo el método onMeasure() que comprueba si el teclado está abierto.

public static class MyEditText extends EditText { 
      MyActivity context; 

      public void setContext(MyActivity context) { 
       this.context = context; 
      } 

      @Override 
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
       int height = MeasureSpec.getSize(heightMeasureSpec); 
       Activity activity = (Activity)getContext(); 
       Rect rect = new Rect(); 
       activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); 
       int statusBarHeight = rect.top; 
       int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight(); 
       int diff = (screenHeight - statusBarHeight) - height; 
       // assume all soft keyboards are at least 128 pixels high 
       if (diff>128) 
        context.showHandle(false); 
       else 
        context.showHandle(true); 

       super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
      } 
    } 

Luego, en la actividad, si el teclado está abierto el cajón de mango se establece en una imagen de 1px x 1 píxel transparente, si el teclado está oculto se muestra el mango real:

private void showHandle(boolean show) { 
    ImageView drawer_handle = (ImageView) findViewById(R.drawable.handle); 
    if (show) 
      drawer_handle.setImageResource(R.drawable.handle); 
    else 
      drawer_handle.setImageResource(R.drawable.handle_blank); 
} 

Por último, asegúrese de llamar setContext() en onCreate() de MyActivity

MyEditText met = (MyEditText) findViewById(R.id.edit_text); 
met.setContext(this); 
Cuestiones relacionadas