Impedisci la rotazione dello schermo su Android


315

Ho una delle mie attività che vorrei impedire la rotazione perché sto avviando un AsyncTask e la rotazione dello schermo lo riavvia.

C'è un modo per dire questa attività "NON RUOTARE lo schermo anche se l'utente sta scuotendo il telefono come un matto"?



11
È possibile gestire la modifica dell'orientamento dello schermo e AsyncTask. Prevenire i cambiamenti di orientamento dello schermo è solo una soluzione pigra. E non è difficile mantenere in vita un AsyncTask attraverso i cambiamenti di orientamento :)
Romain Guy,


56
Sarebbe molto più utile fornire effettivamente una soluzione o del codice, Romain, piuttosto che affermare che "esiste una soluzione e non è difficile".
Peter vdL,

2
puoi usare setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
mcy

Risposte:


467

Inserisci

android:screenOrientation="portrait" 

o

 android:screenOrientation="landscape" 

al <activity>elemento / s nel manifesto e il gioco è fatto.


95
Tieni presente che si tratta solo di nascondere un bug nella tua app, rendendo meno probabile agli utenti di inciampare su di essa. Ma lo faranno ancora. Qualsiasi modifica alla configurazione può causare il riavvio dell'attività. Devi davvero scrivere correttamente la tua attività per gestire l'attività asincrona al riavvio.
hackbod,

1
Questo non ha funzionato per me in un caso. Avevo impostato lo schermo in orizzontale prima di aprire l'app. Quando ho aperto l'app, lo schermo si è trasformato in verticale e ha causato una seconda chiamata a asynctask.
user522559

2
Devi impostare le cose su "apri in modalità verticale" E "rimani sempre in modalità verticale". Fare solo 1 è inutile.
Carol,

1
@hackbod a prescindere, questo è il numero 1 di Google per "app Android che impedisce la rotazione dello schermo", il mio bisogno non ha nulla a che fare con le attività asincrone
chiliNUT

7
@hackbod Come possiamo quindi scrivere correttamente la nostra attività per affrontare questo problema?
user41805,

127

È possibile seguire la logica di seguito per evitare auto gira lo schermo , mentre il vostro AsyncTaskè in esecuzione:

  1. Memorizza il tuo attuale orientamento dello schermo all'interno della tua attività utilizzando getRequestedOrientation().
  2. Disabilita l'orientamento automatico dello schermo usando setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).
  3. Esegui / esegui il tuo AsyncTask.
  4. Al termine del AsyncTaskripristino, utilizzare il precedente stato di orientamento setRequestedOrientation(oldOrientation).

Si noti che ci sono diversi modi per accedere alle proprietà Activity(che vengono eseguite sul thread dell'interfaccia utente) all'interno di un file AsyncTask. Puoi implementare il tuo AsyncTaskcome una classe interna o puoi usare un messaggio Handlerche stimola la tua Activiyclasse.


9
Molto meglio della risposta selezionata.
Matej,

3
ottima idea :) non hai memorizzato il tuo attuale orientamento dello schermo puoi usare ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
fligant

Sembra incredibile, @emre, grazie! Sembra "Troppo bello per essere vero!" Notate l'enorme quantità di discussioni sul problema: stackoverflow.com/q/3821423/294884 ... esperti Android, c'è qualche svantaggio qui ?! Grazie ancora .. mille.
Fattie,

3
Una schifezza!! Questo NON FUNZIONA se il dispositivo inizia a INIZIARE IN MODALITÀ PAESAGGIO. Che diavolo! Sux: O
Fattie,

@Emre, questo codice non funziona in alcuni casi. Ad esempio, se l'utente ha cambiato il suo orientamento tra l'inizio di AsyncTask e la fine di esso. Allora avresti salvato e ripristinato l'orientamento sbagliato.
Pacerier,

27

Nel tuo file manifest, per ogni attività che desideri bloccare la rotazione dello schermo aggiungi: se vuoi bloccarlo in modalità orizzontale:

<activity
        ...
        ...
        android:screenOrientation="landscape">

o se vuoi bloccarlo in modalità verticale:

<activity
            ...
            ...
            android:screenOrientation="portrait">

24

Il modo più semplice che ho trovato per fare questo è stato quello di mettere

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

all'interno di onCreate, subito dopo

setContentView(R.layout.activity_main);

così...

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

7

Invece di entrare in AndroidManifest, potresti semplicemente fare questo:

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);
}

L'unico inconveniente qui è che richiede il livello API 18 o superiore. Quindi in pratica questa è la punta della lancia.


Questa parte disabilita il pulsante Home e le app recenti e anche dopo aver rilasciato il blocco con SCREEN_ORIENTATION_FULL_SENSOR, è disattivato. In Android N.
kAmol il

6

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

2

Il seguente attributo su ACTIVITY in AndroidManifest.xml è tutto ciò che serve:

android:configChanges="orientation"

Quindi, il nodo di attività completo sarebbe:

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

1

Inserisci:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}

1

Aggiungi quanto segue al tuo AndroidManifest.xml

[app> src> principale> AndroidManifest.xml]

<activity android:name=".MainActivity"
          android:configChanges="orientation"
          android:screenOrientation="portrait"/>

Esempio:

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

0

Se stai utilizzando Android Developer Tools (ADT) ed Eclipse puoi andare su AndroidManifest.xml -> scheda Applicazione -> andare in basso e selezionare la tua attività. Infine, seleziona il tuo orientamento preferito. Puoi selezionare una delle tante opzioni.


0

Devi aggiungere il seguente codice nel file manifest.xml. L'attività per la quale non dovrebbe ruotare, in quell'attività aggiungere questo elemento

android:screenOrientation="portrait"

Quindi non ruoterà.


0

Puoi provare in questo modo

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


0

Usa AsyncTaskLoader per proteggere i tuoi dati anche se l'attività cambia, invece di utilizzare AsyncTask che è un modo migliore per creare app che impedire la rotazione dello schermo.


0

Prevenire la rotazione dello schermo è sufficiente aggiungere questa seguente riga nei manifesti.

<activity
        android:name=".YourActivity"
        android:screenOrientation="portrait" />

Questo funziona per me.


0

L'utente "portrait"nel file AndroidManifest.xml potrebbe sembrare una buona soluzione. Ma costringe alcuni dispositivi (che funzionano meglio in orizzontale) ad andare in verticale, senza ottenere l'orientamento corretto. Nell'ultima versione di Android, si indosserà un errore. Quindi il mio suggerimento è meglio usare "nosensor".

<activity
        ...
        ...
        android:screenOrientation="nosensor">
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.