Orientación de la pantalla de Android
He intentado getOrientation()
para obtener el valor de orientación, pero siempre devuelve 0!
- Android SensorManager.java getOrientation y algoritmo getRotationMatrix
- Orientación de la cámara en Android
- ¿Calcula orientación relativa teniendo azimut, tono y rollo en android?
- Rotación de vista previa de la cámara Android
- El método getOrientation () de Android devuelve resultados incorrectos
- Android: notifyDataSetChanged () no actualizar listview después de cambiar la orientación
- OnSurfaceCreated () se llama cambios de orientación cada vez
- Cómo manejar la orientación del vídeo desde dispositivos móviles
- Valores de sensor de orientación incoherentes en Android para azimut / guiñada y rollo
- Mi aplicación Android gira aunque la rotación de la pantalla esté desactivada en el sistema operativo. ¿Cómo puedo arreglar esto?
- Cambiar la orientación, perder todos los elementos de la lista
- La mejor práctica para manejar el cambio de orientación: Android
- ¿Cómo conservar la instancia de fragmento de fragmento de reproducción de vídeo después de un cambio de orientación?
GetOrientation () está obsoleto pero esto no es neccesarily la raíz de su problema. Es cierto que deberías usar getRotation () en lugar de getOrientation () pero solo puedes usarlo si apuntas a Android 2.2 (API Level 8) o superior. Algunas personas e incluso los Googlers a veces parecen olvidar eso.
Como un ejemplo, en mi deseo de HTC con Android 2.2. GetOrientation () y getRotation () ambos reportan los mismos valores:
- 0 (predeterminado, retrato),
- 1 (dispositivo de 90 grados en sentido antihorario),
- 3 (dispositivo de 90 grados en sentido horario)
No informa cuando usted lo pone "en su cabeza" (gire 180, que sería el valor 2). Este resultado es posiblemente específico del dispositivo.
En primer lugar debe aclarar si utiliza un emulador o un dispositivo. ¿Sabes cómo girar el emulador? Entonces yo recomendaría crear un pequeño programa de prueba con un método onCreate () como este:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Display mDisplay = mWindowManager.getDefaultDisplay(); Log.d("ORIENTATION_TEST", "getOrientation(): " + mDisplay.getOrientation()); }
Compruebe si la pantalla de su dispositivo se ha bloqueado en la configuración del dispositivo Configuración> Pantalla> Pantalla de rotación automática . Si esa casilla de verificación está desmarcada, Android no informará cambios de orientación a su Actividad. Para ser claro: no se reiniciará la actividad. En mi caso recibo solamente 0 , como usted describió.
Puede comprobar esto desde su programa si agrega estas líneas a onCreate ()
int sysAutoRotate = 0; try { sysAutoRotate = Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION); } catch (SettingNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("ORIENTATION_TEST", "Auto-rotate Screen from Device Settings:" + sysAutoRotate);
Retornará 0 si Auto-Rotate está desactivado y 1 si Auto-Rotate está activado. Otro intento. En su programa original podría haber establecido en manifiesto
android:screenOrientation="portrait"
El mismo efecto, pero esta vez solo para su actividad. Si usted hizo el pequeño programa de prueba esta posibilidad habría sido eliminado (es por eso que lo recomiendo).
Observación: Sí, todo el tema de orientación / rotación es un tema "interesante". Pruebe las cosas, utilice Log.d (), experimente, aprenda.
Si desea saber si el contenido mostrado actualmente está en modo horizontal o vertical (posiblemente completamente independiente de la rotación física del teléfono), puede utilizar:
getResources().getConfiguration().orientation
Documentación del desarrollador
Orientación pública
Desde: API Nivel 1Orientación general de la pantalla. Puede ser uno de ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT u ORIENTATION_SQUARE.
getOrientation()
está obsoleto. En su lugar, intente getRotation()
.
Para evitar el uso de métodos Deprecated, utilice la clase Configuración de Android que se encuentra aquí . Funciona desde API lvl 1 y aún funciona en los dispositivos Android más recientes. (No obsoleto).
Como ejemplo, considere el fragmento de código siguiente:
Configuration config = getResources().getConfiguration(); if (config.orientation == Configuration.ORIENTATION_PORTRAIT) { setContentView(R.layout.portraitStart); } else { setContentView(R.layout.landscapeStart); }
Lo mejor de la suerte, espero que esta respuesta ayude a quien se encuentre con ella.
Deberías usar:
getResources().getConfiguration().orientation
Puede ser uno de ORIENTATION_LANDSCAPE
, ORIENTATION_PORTRAIT
.
http://developer.android.com/reference/android/content/res/Configuration.html#orientation
/* First, get the Display from the WindowManager */ Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); /* Now we can retrieve all display-related infos */ int width = display.getWidth(); int height = display.getHeight(); int orientation = display.getOrientation();
Creo que usted necesita para crear dos diseños diferentes e inflar diferentes diseños en la orientación diferente. Le estoy dando un código de la muestra que está trabajando muy bien para mí. "Contexto" puede pasar de su actividad en caso de adaptador personalizado. Si está utilizando un adaptador personalizado, puede probar este código:
@Override public View getView(final int position, View convertView, ViewGroup parent) { View rowView = convertView; ViewHolder holder = null; int i = context.getResources().getConfiguration().orientation; if (rowView == null) { LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (i == Configuration.ORIENTATION_PORTRAIT) { rowView = inflater.inflate(R.layout.protrait_layout, null, false); } else { rowView = inflater.inflate(R.layout.landscape_layout, null, false); } holder = new ViewHolder(); holder.button = (Button) rowView.findViewById(R.id.button1); rowView.setTag(holder); } else { holder = (ViewHolder) rowView.getTag(); } return rowView; }
De otro modo usted puede establecer directamente dos diseños diferentes en su código
int i = context.getResources().getConfiguration().orientation; if (i == Configuration.ORIENTATION_PORTRAIT) { ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.protrait_layout, name); } else { ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.landscape_layout, name); }
Tuve el mismo problema en NexusOne SDK 2.3.
Esto lo resolvió: Verifique la orientación en el teléfono Android .
- ¿Dónde informar de los fallos específicos del dispositivo a Samsung?
- Android Completamente transparente Barra de estado?