2010-07-25 3 views
69

Ho un'app che funziona solo in modalità verticale e ho apportato le modifiche nel mio file manifest per ogni attività che l'orientamento deve essere ritratto. Ma quando ruoto il dispositivo, l'attività si ricrea nuovamente. Come non distruggere l'attività?Android, come non distruggere l'attività quando ruoto il dispositivo?

+1

Questo è spesso consigliato contro, si potrebbe provare a impostare l'orientamento delle applicazioni a livello di programmazione con qualcosa di simile: setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); – stealthcopter

+7

Perché sarebbe contro? Diciamo che abbiamo un servizio che richiede 2 secondi per essere eseguito. Se l'attività si distrugge ogni volta, quel servizio continua a funzionare ogni volta mentre ne ho solo bisogno per essere eseguito una volta. –

risposta

114

Per API 12 e al di sotto: aggiungere

android:configChanges="orientation" 

Add "Screensize", se si prendono di mira API 13 o superiore perché ogni volta che cambia l'orientamento così fa le dimensioni dello schermo, altrimenti nuovi dispositivi continueranno per distruggere la tua attività. Si veda la risposta di Uovo di seguito per ulteriori informazioni sull'uso di "Screensize"

android:configChanges="orientation|screenSize" 

alla tua attività in AndroidManifest.xml. In questo modo la tua attività non verrà riavviata automaticamente. Vedi the documentation per ulteriori informazioni

+0

L'attività viene riavviata di nuovo. Non so quale sia il senso di fare tutte le cose che devono essere fatte quando l'attività ruota, anche se non sta ruotando virtualmente. C'è un modo per disabilitare i messaggi che il sensore invia al sistema operativo in merito alla rotazione, o qualcosa del genere, per risolvere questo problema dalla sua radice? – Vasil

+6

su quale dispositivo stai programmando? ricorda che, ad esempio, lo spostamento della tastiera potrebbe anche riavviare la tua attività ... (se questo è il motivo imposta confChanges su "keyboard | keyboardHidden | orientation") –

+1

questa è la risposta giusta grazie mille –

100

Dal flurin documento ufficiale ha detto,

Nota: Se l'applicazione si rivolge a livello di API 13 o superiore (come dichiarato dal minSdkVersion e attributi targetSdkVersion), allora si dovrebbe dichiarare anche il "Screensize "configurazione, perché cambia anche quando un dispositivo passa da un orientamento verticale a uno orizzontale.

Quindi, se i vostri obiettivi app livello di API 13 o superiore, è necessario impostare questa configurazione invece:

android:configChanges="orientation|screenSize"

+4

Grazie mille! Tutte le altre risposte mancano di questa parte in cui il livello API 13 introduce questo oggetto screenSize. Mi hai appena salvato la vita! :) –

+1

@egg Grazie a youuuuuuu! :) Questo ha aiutato! – KarenAnne

+0

grazie mille @egg. Sono stato alle prese con questo ... – sampath

8

La soluzione giusta è

android: configChanges = "orientamento | Screensize"

Documentazione Android:

L'attuale dimensione dello schermo disponibile è cambiata. Ciò rappresenta un cambiamento nella dimensione attualmente disponibile, relativa al rapporto di aspetto corrente, quindi cambierà quando l'utente passa da orizzontale a verticale. Tuttavia, se la tua applicazione punta al livello API 12 o inferiore, l'attività manterrà sempre questa modifica della configurazione stessa (questa modifica alla configurazione non riavvia l'attività, anche quando è in esecuzione su un dispositivo Android 3.2 o successivo).

-1

scrittura in palese:

android:configChanges="orientation|screenSize|keyboardHidden" 

e sostituire questa attività che ha risolto il problema:

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
} 
+1

Perché sovrascrivere il metodo onConfigurationChanged e chiamare l'implementazione originale facendo qualcosa di utile? – ricosrealm

0

avrei dovuto vedermela questo per un po 'e poi relized che dentro il file manifesto Stavo mettendo ConfigChanges a livello di applicazione e non a livello di attività. Ecco come appare il codice quando funziona correttamente per me.

Image of correct manifest files code

+1

Dovresti condividere il codice all'interno del tuo post anziché un'immagine. –

+0

Per favore ** [modifica] ** il tuo post e mostra il codice manifest attuale come testo anziché schermate. Gli altri non possono copiare e incollare dalle tue immagini. [Vedi qui] (https://meta.stackoverflow.com/a/285557/1402846) per i dettagli. Grazie. – Pang