studio - Android determina la orientación de la pantalla en el tiempo de ejecución
orientación horizontal android studio (5)
Intenta correr
getResources().getConfiguration().orientation
Desde su objeto de contexto para averiguar cuál es la orientación de la pantalla en tiempo de ejecución, los valores posibles se documentan here
Para capturar el evento de cambio de orientación, puede encontrar la respuesta en la Guía de desarrollo de Android: Cómo manejar el cambio de configuración usted mismo
De la guía:
Por ejemplo, el siguiente código de manifiesto declara una actividad que maneja tanto el cambio de orientación de la pantalla como el cambio de disponibilidad del teclado:
<actividad android: nombre = ". MiActividad"
android: configChanges = "orientación | keyboardHidden"
android: label = "@ string / app_name">
Ahora, cuando una de estas configuraciones cambia, MyActivity no se reinicia. En su lugar, MyActivity recibe una llamada a onConfigurationChanged (). Este método pasa un objeto de configuración que especifica la nueva configuración del dispositivo. Al leer los campos en la Configuración, puede determinar la nueva configuración y realizar los cambios apropiados al actualizar los recursos utilizados en su interfaz. En el momento en que se llama a este método, el objeto de Recursos de su actividad se actualiza para devolver recursos basados en la nueva configuración, por lo que puede restablecer fácilmente los elementos de su IU sin que el sistema reinicie su actividad.
...
Aquí hay un pseudo código para detectar un evento de rotación de pantalla, y decide retener o cambiar la orientación de la pantalla.
public boolean onOrientationChanges(orientation) {
if(orientation == landscape)
if(settings.get("lock_orientation"))
return false; // Retain portrait mode
else
return true; // change to landscape mode
return true;
}
¿Cómo hago cosas similares en Android?
EDIT: En realidad estoy buscando respuesta sobre dónde manejar los cambios de orientación . No quiero corregir la orientación agregando screenOrientation = "portrait".
Necesito algo, similar a onConfigurationChanges (), donde puedo manejar la orientación, pero no necesito que vuelva a dibujar la vista manualmente.
Necesita una instancia de Display
primer lugar:
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
Entonces la orientación puede ser llamada así:
int orientation = display.getOrientation();
Verifique la orientación a su manera y use esto para cambiar la orientación :
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Espero que ayude.
Actualización :
De acuerdo, supongamos que tienes una oAllow
var que es Boolean
y el valor predeterminado es False
.
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int orientation = display.getOrientation();
switch(orientation) {
case Configuration.ORIENTATION_PORTRAIT:
if(!oAllow) {
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
break;
case Configuration.ORIENTATION_LANDSCAPE:
if(!oAllow) {
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
break;
}
}
Puede agregar más opciones.
No probé esta muestra, pero al menos te da algunas pistas sobre cómo resolver. Dime si tienes algún error.
ACTUALIZAR
getOrientation()
ya está en desuso, consulte aquí . En su lugar, utilice getRotation()
. Para verificar si el dispositivo está en modo horizontal, puedes hacer algo como esto:
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
.getDefaultDisplay();
int orientation = display.getRotation();
if (orientation == Surface.ROTATION_90
|| orientation == Surface.ROTATION_270) {
// TODO: add logic for landscape mode here
}
No necesita interceptar el evento y luego anularlo. Solo usa:
// Allow rotation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
// Lock rotation (to Landscape)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE);
Los puntos a tener en cuenta aquí son, si está en Jellybean y por encima, esto permitirá una rotación de 180 grados cuando esté bloqueado. También cuando está desbloqueado, esto solo permite la rotación si la configuración maestra del usuario es permitir la rotación. Puede prohibir las rotaciones de 180 grados y anular la configuración maestra y permitir la rotación, y mucho más, así que eche un vistazo a las opciones en ActivityInfo
Además, si ha establecido previamente que no habrá rotación, su actividad no se destruirá y luego se reiniciará, solo para que establezca la orientación de nuevo, lo que hará que la actividad se reinicie nuevamente; Por lo tanto, establecer lo que desea por adelantado puede ser mucho más eficiente .
Pre uso de Jellybean ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
- no hay rotación de 180 grados con esto.
Verifique la orientación de su pantalla de Android en Runtime:
ListView listView = (ListView) findViewById(R.id.listView1);
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
//do work for landscape screen mode.
listView.setPadding(0, 5, 0, 1);
} else if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
//Do work for portrait screen mode.
listView.setPadding(1, 10, 1, 10);
}
if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
// portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
// landscape
}