2012-03-03 10 views
7

He creado una ventana emergente que contiene la vista de mes para recoger la fecha. Cuando cambio de orientación, debido a que Android carga una actividad una vez más, mi Ventana emergente desaparece. ¿Cómo puedo abrirlo incluso cuando la orientación cambia en el tiempo de ejecución?¿Cómo mantener abierta la ventana emergente cuando la orientación cambia en el tiempo de ejecución en Android?

+0

también se puede leer este http://blog.doityourselfandroid.com/2010/11/14/handling-progress-dialogs- y-screen-orientation-changes/ –

Respuesta

5

incluya android:configChanges="orientation" en su AndroidManifest.xml en la ventana de visualización de la actividad. Hacer esto le dice a Android que usted va a manejar el cambio de orientación usted mismo y eventualmente no destruirá su actividad y mantendrá la ventana mostrada.

Esta técnica es buena si no tiene diferentes diseños para el modo retrato y paisaje. Sin embargo, si lo hace, es posible que realice implementación personalizada diseño detectando el modo de orientación de la siguiente manera:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.i("orientation", "Orientation changed to: Landscape"); 
    else 
     Log.i("orientation", "Orientation changed to: Portrait"); 
} 

para previsualizar, descargar e instalar this sample app.

+1

¿Tiene dos diseños diferentes para las orientaciones vertical y horizontal? porque acabo de probar esto en un solo diseño xml para ambas orientaciones y funcionó bien – waqaslam

+0

hmm extraño, porque lo probé en un único diseño y funciona bien. Ver mi demo apk en http://www.2shared.com/file/LdtQTybl/HelloWorld.html – waqaslam

+0

http://speedy.sh/n59h3/HelloWorld.apk – waqaslam

4

Siempre que haya un cambio de orientación, Android destruye su actividad (llama al onDestroy()) y luego la reinicia (llama al onCreate()).
Tan pronto como aparezca su ventana emergente, establezca un indicador popup_open=1. Su ventana emergente tendrá, naturalmente, un botón de descartar. Establezca el indicador = 0 en el controlador de clic de este botón. A continuación, puede volver a abrir la ventana emergente cuando la aplicación se reinicia en el método onRestoreInstanceState() o en el onCreate(). Aquí harías un control de la bandera. Si la bandera está configurada en 1, abre la ventana emergente. Por lo tanto, incluso si la orientación cambió mientras la ventana emergente estaba activa, onRestoreInstanceState() sabrá qué hacer en función del estado de la bandera. Para obtener más información de referencia: How to handle runtime changes.

+0

asumiremos que su ventana emergente tiene algún botón para que el usuario la cierre. En el controlador de clic de este botón, tendría 'popup_open = 0'. Establezca 'popup_open = 1' tan pronto como se inicie su ventana emergente. Entonces, si la ventana emergente está abierta y la orientación cambia, la bandera no se habría establecido en 0 y, por lo tanto, 'onRestoreInstanceState()' debería arreglar todo. Editaré mi respuesta para manejar la configuración de la bandera con la ventana emergente en lugar de onSaveInstanceState hacerlo. – Urban

+0

sí, así que estaba tratando de decir que debe establecer el indicador en este método 'OnClick()' que contiene el objeto emergente. Anteriormente había sugerido establecer la bandera en 'onSaveInstanceState'. – Urban

+0

Creo que te estás confundiendo. ¿Por qué intentas registrar onSaveInstance? Como sugiere el nombre de este método, este método se llama justo antes de destruir la aplicación (es decir, inmediatamente después del cambio de orientación, cuando Android está a punto de reiniciar su aplicación). Debe verificar el valor en CUALQUIER 'onRestoreInstanceState()' O 'onCreate() '. Eche un vistazo al enlace que he dado en mi respuesta. – Urban

1

Añadir esta propiedad a su actividad en manifest.xml

android:configChanges="orientation|keyboard" 

y que debe hacerlo.

+0

Algunas personas simplemente no pueden quitar sus manos del botón de abajo, si mi respuesta era incorrecta, ¿esa persona podría explicarme por qué? –

0

Mostrando PopupWindow como

final View parent = findViewById(R.id.{parentId}); 
parent.post(new Runnable() { 
    @Override 
    public void run() { 
     mPopup.showAtLocation(parent, ...); 
    } 
}); 

resuelve excepción no controlada en el cambio de orientación

Cuestiones relacionadas