Android: permite el retrato y el paisaje para las tabletas, pero el retrato de la fuerza en el teléfono?
Quisiera que las tabletas pudieran exhibir en retrato y paisaje (sw600dp o más grande), pero los teléfonos se limitarán al retrato solamente. No puedo encontrar ninguna manera de condicionalmente elegir una orientación. ¿Alguna sugerencia?
- Problema con la detección de tabletas Synchro Digital
- No se encontró ningún identificador de recursos para XLargeScreens
- Clasificadores de diseño de la pestaña Galaxy 10
- El fondo xml no cambia cuando uso la tableta
- Establecer configuración regional que no funciona en tablets
- Android - mount: Sistema de archivos de sólo lectura
- Implementación de Gmail Tablet como Gaveta de navegación
- ¿Cómo puedo hacer el diseño que funcionará tanto en Tablet como en el teléfono?
- Mi aplicación no aparece en las tablas
- ¿Por qué la aplicación Android se ejecuta en una ventana pequeña en el emulador de tableta?
- Evitar las descargas de la aplicación de la tableta
- Herramienta de visualización para móviles (tableta)
- No se puede usar android: xlargeScreens = "true"?
Esta es una buena manera de usar recursos y clasificadores de tamaño .
Ponga este recurso bool en res / values como bools.xml o lo que sea (los nombres de archivo no importan aquí):
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="portrait_only">true</bool> </resources>
Pon esto en res / values-sw600dp y res / values-xlarge:
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="portrait_only">false</bool> </resources>
Vea esta respuesta suplementaria para ayudar a agregar estos directorios y archivos en Android Studio.
A continuación, en el método onCreate de sus Actividades, puede hacer lo siguiente:
if(getResources().getBoolean(R.bool.portrait_only)){ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }
Los dispositivos que tienen más de 600 dp en la dirección de ancho más pequeño, o x-large en los dispositivos pre-Android 3.2 (tabletas, básicamente) se comportarán como normal, basado en el sensor y la rotación bloqueada por el usuario, etc. Todo lo demás (teléfonos, prácticamente) será sólo retrato.
Puede probar de esta manera primero obtener el tamaño de pantalla del dispositivo
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) { Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show(); } else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) { Toast.makeText(this, "Normal sized screen" , Toast.LENGTH_LONG).show(); } else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) { Toast.makeText(this, "Small sized screen" , Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show(); }
Y luego establecer la orientación de acuerdo con ese
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
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 retrato y paisaje (asegúrese de agregar el tamaño de pantalla – no ha utilizado para necesitar esto!) No necesita configurar una orientación de pantalla aquí. :
android:configChanges="keyboardHidden|orientation|screenSize"
Métodos para agregar en cada Actividad:
public static boolean isXLargeScreen(Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; }
Y: (si no anula este método, la aplicación llamará onCreate () al cambiar orientaciones)
@Override public void onConfigurationChanged (Configuration newConfig) { super.onConfigurationChanged(newConfig); if (!isXLargeScreen(getApplicationContext()) ) { return; //keep in portrait mode if a phone } //I set background images for landscape and portrait here }
En onCreate () de cada actividad:
if (!isXLargeScreen(getApplicationContext())) { //set phones to portrait; setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else { //I set background images here depending on portrait or landscape orientation }
Lo único que no puedo entender es cómo obtener la aplicación para cambiar los archivos de diseño al cambiar de paisaje a retrato o viceversa. Supongo que la respuesta es hacer algo similar a lo que hace el enlace anterior, pero no pude conseguir que funcione para mí – eliminó todos mis datos. Pero si usted tiene una aplicación bastante simple que tiene el mismo archivo de diseño para el retrato y el paisaje, esto debería funcionar.
Suplemento a la respuesta aceptada
Puede realizar los siguientes pasos en Android Studio para agregar los directorios res/values-sw600dp
y res/values-large
con sus archivos bools.xml
.
Valores-sw600dp
En primer lugar, en la ficha Proyecto, seleccione el filtro Proyecto (en lugar de Android) en el navegador.
A continuación, haga clic con el botón app/src/main/res
directorio app/src/main/res
. Elija Nuevo > Directorio de recursos de Android .
Seleccione Ancho de pantalla más pequeño y, a continuación, pulse el botón >> .
Escriba 600
para el ancho de pantalla más pequeño. El nombre del directorio se generará automáticamente. Decir ok.
A continuación, haga clic con el botón derecho del ratón en el archivo de values-sw600dp
recién creado values-sw600dp
. Elija Nuevo > Valora archivo de recursos . Escriba bools
para el nombre.
Valores grandes
La adición de un directorio de values-large
sólo es necesario si está apoyando pre Android 3.2 (API nivel 13). De lo contrario, puede omitir este paso. El directorio values-large
corresponde a values-sw600dp
. ( values-xlarge
corresponde a values-sw720dp
.)
Para crear el directorio values-large
, siga los mismos pasos que anteriormente, pero en este caso elija Size en lugar de Smallest Screen Width. Seleccione Grande . El nombre del directorio se generará automáticamente.
Haga clic derecho en el directorio como antes para crear el archivo bools.xml
.
Bueno, esto es un poco tarde pero, aquí es un XML-Sólo, pero una solución de hack que no recrea una actividad como setRequestedOrientation
sí tiene que cambiar la orientación:
Después de la respuesta de Ginny , creo que la forma más confiable de hacerlo es la siguiente:
Como se describe aquí , poner un booleano en los recursos sw600dp. Debe tener el prefijo sw de lo contrario no funcionará correctamente:
En res / valores-sw600dp / dimens.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="isTablet">true</bool> </resources>
En res / values / dimens.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="isTablet">false</bool> </resources>
Luego, haga un método para recuperar ese booleano:
public class ViewUtils { public static boolean isTablet(Context context){ return context.getResources().getBoolean(R.bool.isTablet); } }
Y una actividad base para extender desde las actividades en las que desea este comportamiento:
public abstract class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!ViewUtils.isTablet(this)) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } } }
Así, cada actividad extendería BaseActivity:
public class LoginActivity extends BaseActivity //....
Importante : incluso si se extiende desde BaseActivity
, debe agregar la línea android:configChanges="orientation|screenSize"
a cada Activity
en su AndroidManifest.xml:
<activity android:name=".login.LoginActivity" android:configChanges="orientation|screenSize"> </activity>
La vieja pregunta que sé. Con el fin de ejecutar su aplicación siempre en el modo de retrato incluso cuando la orientación puede ser o se intercambia etc (por ejemplo en las tabletas) he diseñado esta función que se utiliza para configurar el dispositivo en la orientación correcta sin la necesidad de saber cómo el retrato y el paisaje Las características se organizan en el dispositivo.
private void initActivityScreenOrientPortrait() { // Avoid screen rotations (use the manifests android:screenOrientation setting) // Set this to nosensor or potrait // Set window fullscreen this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); DisplayMetrics metrics = new DisplayMetrics(); this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); // Test if it is VISUAL in portrait mode by simply checking it's size boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels ); if( !bIsVisualPortrait ) { // Swap the orientation to match the VISUAL portrait mode if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ) { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); } } else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); } }
¡Funciona de maravilla!
AVISO: Cambie this.activity
actividad por su actividad o agréguela a la actividad principal y quite this.activity
😉
Si quieres hacer lo contrario, debes cambiar el código a paisaje (pero creo que está claro cómo hacerlo).
- ListView horizontal en Android?
- Android – Cómo cambiar dinámicamente el texto del elemento de menú fuera de onOptionsItemsSelected o onCreateOptionsMenu