2011-04-11 9 views
28

Bien, tengo un cuadro de AlertDialog con aproximadamente 10 controles (texto y vista de texto) en él. Estos controles están en una vista de desplazamiento con alertdialog, además tengo 2 botones positivos y negativos. El problema que tengo es cuando aparece el teclado suave, los dos botones están ocultos detrás del teclado.Cómo cambiar el tamaño de AlertDialog en la pantalla del teclado

Estaba buscando algo así como la función de redibujar en mi Vista interior o en el cuadro de diálogo.

Si alguien tiene alguna idea, por favor ayuda. Debajo está la captura de pantalla de lo que estoy hablando.

enter image description here

Respuesta

90

Si su cuadro de diálogo era una actividad que utiliza uno de los temas del cuadro de diálogo, puede aplicar este comportamiento configurando el indicador adjustResize para el parámetro windowSoftInputMode de la actividad.

que estoy usando:

android:windowSoftInputMode="adjustResize|stateHidden" 

Creo que todavía se puede usar esta marca con diálogos regulares, pero no estoy seguro de cómo aplicarlo. Puede que tenga que crear su AlertDialog con un tema personalizado que herede el tema principal correcto y también establece ese indicador, o puede que tenga que usar ContextThemeWrappers y esas cosas.

O tal vez solo puede usar Window#setSoftInputMode.

alertDialog.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 
+9

La última línea me funciona, idealmente supongo que esa era la pregunta aquí y esta es la respuesta correcta. La respuesta seleccionada es más una sugerencia de cambio de diseño que una respuesta correcta. +1 para la respuesta –

+0

¡Hola, nmr, la última línea también me ha funcionado! Gracias. – Luke47

+4

si tiene un estilo personalizado, también puede convertirlo en un elemento de la definición de estilo '' – ChristophK

2

tal vez usted no necesita cambiar el tamaño de diálogo

añadir androide: imeOptions = "actionNext" a EditarTexto (todas menos la última) (él botón "Siguiente" se sumará al teclado - ir al siguiente EditarTexto)

y añadir androide: imeOptions = "actionDone" al último EditarTexto (botón "Done" - ocultar teclado)

ahora el usuario debe ser capaz de hacer clic botones

si va a crear cuadros de texto en el código de función de uso EditText # setImeOptions

HTH

+1

Gracias por la información, pero eso no es exactamente cómo se comportará el usuario en este caso. Es decir, tienen la libertad de llenar solo una o más de las cajas de texto, no todas. – Sanj

+0

Supongo que tiene un punto válido. – Sanj

1

¿Está obligado a tenerlo como una ventana emergente? La ventana emergente se ve tan grande que es posible que desee tenerla como una actividad separada. En general, las ventanas emergentes se utilizan para proporcionar una breve pregunta o declaración con algunas opciones, no un formulario completo de entrada de datos. Como no se puede ver mucho detrás de la ventana emergente grande, de todos modos no se está exponiendo ningún control subyacente.

+2

Si bien su respuesta me parece verdadera, no aborda los casos límite. ¿Qué tal un cuadro de diálogo de tamaño mediano en una tableta? – nmr

+0

Es cierto, estaba pensando en la computadora de mano, dada la captura de pantalla. Si está haciendo una interfaz de usuario separada para una tableta, supongo que un cuadro de diálogo de tamaño mediano para una tableta puede funcionar, pero creo que, en general, un cuadro de diálogo debe usarse para entradas de datos muy pequeñas, y solo para notificaciones. Si intentas convertir algo en una forma, tenlo como una actividad separada. –

+4

Pero esto no responde la pregunta. – ViliusK

10

He encontrado la mejor manera de manejar esto. Como este es un cuadro de diálogo, el código "alertDialog.getWindow(). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);" no funciona muy bien

Además de este código, debe establecer un estilo de diálogo para este cuadro de diálogo. El estilo debe tener gusto debajo:

<style name="DialogStyle" parent="@android:style/Theme.Black.NoTitleBar.Fullscreen"> 
    <item name="android:windowFullscreen">false</item> 
    ...... 
    ...... 
</style> 

observar que el atributo " padre" es "Theme.Black.NoTitleBar.Fullscreen" como el estilo de una actividad. y el atributo "android: windowFullScreen" debería ser falso.

Ahora, el diálogo cambiará de tamaño cuando se alterne el teclado virtual.

+0

Esto funcionó perfectamente. Gracias. –

0

para mostrar el teclado inmediatamente y ajustar el tamaño:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus) { 
      dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 
     } 
    } 
}); 
2

Nada funcionó para mí, excepto adjustPan

según la documentación

ventana principal de la actividad no cambia de tamaño para dar cabida a el teclado suave. Más bien, el contenido de la ventana se panoramiza automáticamente para que el enfoque actual nunca se oculte por el teclado y los usuarios siempre pueden ver lo que escriben. En general, esto es menos conveniente que cambiar el tamaño, ya que el usuario puede necesitar cerrar el teclado virtual para acceder e interactuar con las partes oscuras de la ventana.

Así que simplemente utilizarlo en su onCreate() o el método como onCreateView():

getDialog().getWindow().setSoftInputMode(
      WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 

O simplemente android:windowSoftInputMode="adjustPan" en el manifiesto para el Activiry en el que estamos jugando con diálogos

y use android:windowSoftInputMode="adjustResize|stateHidden" en cada texto de edición que ayudará al usuario a navegar al siguiente cuadro de texto fácilmente.

Punto a recordar

Nunca use MATCH_PARENT para hacer la pantalla de diálogo como adjustPan no funcionará aquí. Si alguien quiere hacer que el diálogo encaje en la pantalla, solo use puntos hasta 0.96 (no más que esto) para la altura, de modo que el teclado alcance correctamente el texto de edición. Hice como a continuación:

@Override 
public void onStart() 
{ 
    super.onStart(); 
    Dialog dialog = getDialog(); 
    if (dialog != null) 
    { 
     //int height = ViewGroup.LayoutParams.MATCH_PARENT; 
     int width = ViewGroup.LayoutParams.MATCH_PARENT; 
     Display display = getActivity().getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     //int width = (int)(size.x * 0.96); 
     int h = (int)(size.y * 0.96); 

     dialog.getWindow().setLayout(width, h); 
    } 
} 

Mira, si voy a utilizar la altura total (MATCH_PARENT) y luego se soft_keyboard squize el diálogo. Pero si voy a usar puntos para la altura (aquí 0.96 que está casi cerca de match_parent), entonces funcionará correctamente.

Espero que ayude a alguien :)

Cuestiones relacionadas