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?

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.

Introduzca aquí la descripción de la imagen

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 >> .

Introduzca aquí la descripción de la imagen

Escriba 600 para el ancho de pantalla más pequeño. El nombre del directorio se generará automáticamente. Decir ok.

Introduzca aquí la descripción de la imagen

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.

Introduzca aquí la descripción de la imagen

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:

https://stackoverflow.com/a/27015879/1281930

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).

  • ¿Cómo puedo proporcionar soporte de orientación para tablet solo en android?
  • Cajón de navegación: ajuste siempre abierto en tabletas
  • Cómo evitar que la aplicación se ejecute en tablets Android
  • La orientación del paisaje bloqueado en la actividad tablet + se inició cuando el dispositivo en vertical = rotación visible en la pantalla
  • ¿Por qué mi aplicación no es compatible con nexus 7 en Google Play?
  • Nuevo NavigationDrawer en tabletas con disposición fija a la izquierda
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.