Evita la rotación de la pantalla en Android
Tengo una de mis actividades que me gustaría evitar de girar porque estoy empezando un AsyncTask, y la rotación de la pantalla hace que se reinicie.
¿Hay alguna manera de decirle a esta actividad "NO ROTA la pantalla aunque el usuario esté sacudiendo su teléfono como loco"?
- Widget Android ImageButton pierde imagen cuando se gira la pantalla
- Android: gira la imagen en la vista de la imagen por un ángulo
- Rotate jpeg utilizando ExifInterface no funciona a veces
- Rotar imagen junto con toque para fijar punto en android
- Las vistas de Disposición de Android giradas y espaciadas alrededor de un círculo?
- Texto de vista de texto de android en dirección vertical
- Bloqueo de orientación de la pantalla
- Cómo crear una imagen giratoria controlada por gestos para una interfaz de usuario
- Rotar marcador / icono de coche en google maps - Android
- Rotación del videobuffer real en Videoview
- Lienzo dirección drawtext
- Android: los mapas de bits cargados desde la galería se giran en ImageView
- Stream de video de autorrotación TextureView en Nexus4 (pero no en Galaxy S4)
Añadir android:screenOrientation="portrait"
al elemento <activity>
en el manifiesto o en el landscape
y ya está.
Puede seguir la lógica a continuación para evitar la rotación automática de la pantalla mientras se ejecuta su AsyncTask
:
- Guarde su orientación de pantalla actual dentro de su actividad usando
getRequestedOrientation()
. - Deshabilite la orientación automática de la pantalla mediante
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
. - Ejecutar / ejecutar su
AsyncTask
. - Al final de su
AsyncTask
restaure su estado de orientación anterior usandosetRequestedOrientation(oldOrientation)
.
Tenga en cuenta que hay varias maneras de acceder a las propiedades de Activity
(que se ejecuta en el subproceso de UI) dentro de AsyncTask
. Puede implementar su AsyncTask
como una clase interna o puede utilizar el Activiy
mensajes que poke su clase Activiy
.
En su archivo de manifiesto, para cada actividad que desea bloquear la rotación de pantalla, agregue: si desea bloquearla en modo horizontal:
<activity ... ... android:screenOrientation="landscape">
O si desea bloquearlo en modo vertical:
<activity ... ... android:screenOrientation="portrait">
La manera más fácil que encontré para hacer esto era poner
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Dentro de Creer, justo después
setContentView(R.layout.activity_main);
asi que…
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }
Actividad.java
@Override public void onConfigurationChanged(Configuration newConfig) { try { super.onConfigurationChanged(newConfig); if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // land } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // port } } catch (Exception ex) { }
AndroidManifest.xml
<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="QRCodeActivity" android:label="@string/app_name" android:screenOrientation="landscape" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
En lugar de entrar en el AndroidManifest, podría hacer esto:
screenOrientation = getResources().getConfiguration().orientation; getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); ... AsyncTask screenOrientation = getResources().getConfiguration().orientation; @Override protected void onPostExecute(String things) { context.setRequestedOrientation(PlayListFragment.screenOrientation); or context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); }
El único inconveniente aquí es que requiere API de nivel 18 o superior. Así que, básicamente, esta es la punta de la lanza.
El siguiente atributo en la ACTIVIDAD en AndroidManifest.xml es todo lo que necesita:
android:configChanges="orientation"
Por lo tanto, el nodo de actividad completa sería:
<activity android:name="Activity1" android:icon="@drawable/icon" android:label="App Name" android:excludeFromRecents="true" android:configChanges="orientation"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
Añadir:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); ... ... ... }
Si está utilizando las herramientas para desarrolladores de Android (ADT) y Eclipse , puede ir a su AndroidManifest.xml -> ficha Aplicación -> bajar y seleccionar su actividad. Finalmente, seleccione su orientación preferida. Puede seleccionar una de las muchas opciones.
Debe agregar el siguiente código en el archivo manifest.xml. La actividad para la cual no debe girar, en esa actividad añadir este elemento
android:screenOrientation="portrait"
Entonces no girará.