Me gustaría que las tabletas se puedan mostrar en vertical y horizontal (sw600dp o superior), pero los teléfonos se restringirán solo a vertical. No puedo encontrar ninguna manera de elegir condicionalmente una orientación. ¿Alguna sugerencia?
android
tablet
screen-orientation
Kenny Wyland
fuente
fuente
layout-land
unares
carpeta interna .Respuestas:
Aquí hay una buena manera de usar recursos y calificadores de tamaño .
Ponga este recurso bool en res / values como bools.xml o lo que sea (los nombres de archivo no importan aquí):
Ponga este en res / values-sw600dp y res / values-xlarge:
Consulte esta respuesta complementaria para obtener ayuda para agregar estos directorios y archivos en Android Studio.
Luego, en el método onCreate de sus Actividades, puede hacer esto:
Dispositivos que son más de 600 dp en la dirección de la anchura más pequeña, o x-grande en dispositivos pre-Android 3.2 (comprimidos, básicamente) se comportarán como normal, sobre la base de sensor y rotación de enganche de usuario, etc . Todo lo demás (teléfonos, más o menos) será solo retrato.
fuente
xlarge
también o puedo usarsw600dp
? Probablemente no hay ninguna tableta con <3.2 en estos días.onCreate()
. Cuando moví la llamada asetRequestedOrientation()
una posición diferente en tiempo y contexto, el reinicio ya no sucedió.Puede intentar de esta manera primero obtener el tamaño de pantalla del dispositivo
y luego establecer la orientación de acuerdo a eso
fuente
Configuration
proporcionascreenLayout
información - DPI. Mientras que la pregunta está relacionada con el tamaño de la pantalla del dispositivo físico - teléfono VS tableta. Es decir, puede tener unaConfiguration.SCREENLAYOUT_SIZE_NORMAL
y sería una tableta MDPI.Suplemento a la respuesta aceptada
Puede realizar los siguientes pasos en Android Studio para agregar los directorios
res/values-sw600dp
yres/values-large
con susbools.xml
archivos.valores-sw600dp
En primer lugar, desde la pestaña Proyecto, seleccione el filtro Proyecto (en lugar de Android) en el navegador.
Luego haga clic derecho en el
app/src/main/res
directorio. Elija Nuevo > Directorio de recursos de Android .Seleccione Ancho de pantalla más pequeño y luego presione el botón >> .
Escriba
600
para el ancho de pantalla más pequeño. El nombre del directorio se generará automáticamente. Decir ok.Luego haga clic derecho en el
values-sw600dp
archivo recién creado . Elija Nuevo > Archivo de recursos de valores . Escribabools
para el nombre.valores grandes
Agregar un
values-large
directorio solo es necesario si es compatible con Android 3.2 anterior (API nivel 13). De lo contrario, puede omitir este paso. Elvalues-large
directorio corresponde avalues-sw600dp
. (values-xlarge
corresponde avalues-sw720dp
)Para crear el
values-large
directorio, siga los mismos pasos que anteriormente, pero en este caso elija Tamaño en lugar de Ancho de pantalla más pequeño. Seleccione grande . El nombre del directorio se generará automáticamente.Haga clic derecho en el directorio como antes para crear el
bools.xml
archivo.fuente
Así es como lo hice (inspirado en http://androidblogger.blogspot.com/2011/08/orientation-for-both-phones-and-tablets.html ):
En AndroidManifest.xml, para cada actividad que desee poder cambiar entre vertical y horizontal (asegúrese de agregar screenSize, ¡no solía necesitar esto!) No necesita establecer una orientación de pantalla aquí. :
Métodos para agregar en cada Actividad:
y: (si no anula este método, la aplicación llamará a onCreate () cuando cambie de orientación)
En onCreate () de cada actividad:
Lo único que parece que no puedo entender es cómo hacer que la aplicación cambie los archivos de diseño al cambiar de horizontal a vertical o viceversa. Supongo que la respuesta es hacer algo similar a lo que hace el enlace anterior, pero no pude hacer que eso funcione para mí: eliminó todos mis datos. Pero si tiene una aplicación lo suficientemente simple como para tener el mismo archivo de diseño para retrato y paisaje, esto debería funcionar.
fuente
Siguiendo la respuesta de Ginny , creo que la forma más confiable de hacerlo es la siguiente:
Como se describe aquí , coloque un valor booleano en los recursos sw600dp. Debe tener el prefijo sw; de lo contrario, no funcionará correctamente:
en res / values-sw600dp / dimens.xml
en res / values / dimens.xml
Luego haga un método para recuperar ese booleano:
Y una actividad base para extender desde las actividades donde desea este comportamiento:
Entonces, cada actividad ampliaría BaseActivity:
Importante : incluso si se extiende desde
BaseActivity
, debe agregar la líneaandroid:configChanges="orientation|screenSize"
a cada unoActivity
en su AndroidManifest.xml:fuente
Bueno, esto es un poco tarde, pero aquí hay una solución de pirateo solo para XML que no recrea una actividad como
setRequestedOrientation
si tuviera que cambiar de orientación:https://stackoverflow.com/a/27015879/1281930
fuente
Después de la respuesta aceptada , estoy agregando el archivo kotlin con la solución espero que ayude a alguien
Ponga este recurso bool
res/values
como bools.xml o lo que sea (los nombres de archivo no importan aquí):Pon este
res/values-sw600dp
yres/values-sw600dp-land
:Luego, agréguelo en las líneas de abajo en su actividad o fragmentación
fuente
Otras soluciones no funcionaron para mí. Todavía tenía un extraño problema de orientación con diálogos y problemas de recreación. Mi solución fue extender la Actividad, forzándola como retrato en manifiesto.
Ejemplo:
manifest.xml:
en actividad de pantalla de bienvenida:
fuente
Antigua pregunta que sé. Para ejecutar su aplicación siempre en modo vertical, incluso cuando la orientación puede o no se intercambia, etc. (por ejemplo, en tabletas), diseñé esta función que se usa para configurar el dispositivo en la orientación correcta sin la necesidad de saber cómo es vertical y horizontal Las funciones están organizadas en el dispositivo.
¡Funciona de maravilla!
AVISO: Cambie
this.activity
por su actividad o agréguelo a la actividad principal y eliminethis.activity
;-)Si desea hacer lo contrario, debe cambiar el código a horizontal (pero creo que está claro cómo hacerlo).
fuente
Desafortunadamente, el uso del método setRequestedOrientation (...) hará que la actividad se reinicie, por lo que incluso si llama a esto en el método onCreate, pasará por el ciclo de vida de la actividad y luego recreará la misma actividad en la orientación solicitada. Entonces, en la respuesta de @Brian Christensen, debe considerar que el código de actividad podría llamarse dos veces, esto podría tener efectos negativos (no solo visuales, sino también en solicitudes de red, análisis, etc.).
Además, establecer el atributo configChanges en el manifiesto es, en mi opinión, una gran compensación, lo que podría tener un costo de refactorización masivo. Los desarrolladores de Android no recomiendan cambiar ese atributo .
Finalmente, tratar de configurar la pantalla La orientación de alguna manera diferente (para evitar el problema de reinicio) es imposible, estáticamente imposible debido al manifiesto estático que no se puede cambiar, programáticamente solo es posible llamar a ese método en la actividad ya iniciada.
Resumen: En mi opinión, la sugerencia de @Brian Christensen es la mejor solución de compromiso, pero tenga en cuenta el problema de la actividad de reinicio.
fuente