rotacion - Evitar la rotación de pantalla en Android
manejando la rotación de pantalla en android studio (13)
Tengo una de mis actividades que me gustaría evitar que gire porque estoy iniciando una AsyncTask, y la rotación de la pantalla la reinicia.
¿Hay alguna forma de decirle a esta actividad "NO ROTAR la pantalla incluso si el usuario está sacudiendo su teléfono como loco"?
Añadir
android:screenOrientation="portrait"
o
android:screenOrientation="landscape"
al elemento / a <activity>
en el manifiesto y listo.
Añadir:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
...
...
...
}
Agrega lo siguiente a tu AndroidManifest.xml
[app> src> main> AndroidManifest.xml]
<activity android:name=".MainActivity"
android:configChanges="orientation"
android:screenOrientation="portrait"/>
Ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx.zzzzzz.yyyyy">
<uses-permission android:name="A-PERMISSION" />
<application>
<activity android:name=".MainActivity"
android:screenOrientation="portrait"
android:configChanges="orientation">
</activity>
</application>
</manifest>
En lugar de entrar en AndroidManifest, puedes 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 un nivel de API 18 o superior. Así que básicamente esta es la punta de la lanza.
En su archivo de Manifiesto, para cada Actividad en la que desee bloquear la rotación de pantalla, agregue: si desea bloquearlo en modo horizontal:
<activity
...
...
android:screenOrientation="landscape">
o si quieres bloquearlo en modo vertical:
<activity
...
...
android:screenOrientation="portrait">
La forma más fácil que encontré para hacer esto fue poner
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
dentro de onCreate, 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);
}
Puede seguir la lógica a continuación para evitar que la pantalla gire automáticamente mientras se ejecuta su AsyncTask
:
- Almacene su orientación de pantalla actual dentro de su actividad usando
getRequestedOrientation()
. - Deshabilite la orientación automática de la pantalla utilizando
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
. - Ejecutar / ejecutar su
AsyncTask
. - Al final de su
AsyncTask
restaure su estado de orientación anterior usando setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) .
Tenga en cuenta que hay varias formas de acceder a las propiedades de la Activity
(que se ejecuta en el subproceso de la IU) dentro de una AsyncTask
. Puede implementar su AsyncTask
como una clase interna o puede usar el Activiy
mensajes que Activiy
su clase de Activiy
.
Puedes probar de esta manera
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itclanbd.spaceusers">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Login_Activity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Si está utilizando Android Developer Tools (ADT) y Eclipse , puede ir a su AndroidManifest.xml -> pestaña de aplicación -> bajar y seleccionar su actividad. Finalmente, seleccione su orientación preferida. Puede seleccionar una de las muchas opciones.
Tienes que agregar el siguiente código en el archivo manifest.xml. La actividad por la que no debe rotar, en esa actividad agregar este elemento
android:screenOrientation="portrait"
Entonces no girará.
Todo lo que necesita es el siguiente atributo en la ACTIVIDAD en AndroidManifest.xml:
android:configChanges="orientation"
Entonces, 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>
Use AsyncTaskLoader para mantener sus datos seguros incluso si la actividad cambia, en lugar de usar AsyncTask, es una forma mejor de crear aplicaciones que de evitar la rotación de la pantalla.
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>