2012-07-20 9 views
5

Quando si capovolge il telefono Android, la mia attività non ruota per mostrare il layout capovolto ma rimane in modalità orizzontale. Ho provato questo con un'app HelloWorld molto semplice. Ho aggiunto android:configChanges="orientation" al manifest e ho annullato onConfigurationChange() nell'attività per impostare i breakpoint lì. Ruotando il dispositivo capovolto si ottiene una modifica di configurazione per passare dal verticale (al contrario) al paesaggio, ma non un secondo passaggio da orizzontale a verticale (capovolto). Si tratta di un problema Android o c'è qualcosa che devo fare?La rotazione capovolta non attiva la modifica della configurazione

manifesto:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="hello.world" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="10" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:configChanges="orientation" 
      android:name=".HelloWorldActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

attività:

public class HelloWorldActivity 
    extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    } 

    public void onConfigurationChanged(Configuration newConfig) 
    { 
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    { 
     Log.e("MDO", "orientation change: landscape"); 
    } 
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
    { 
     Log.e("MDO", "orientation change: portrait"); 
    } 
    } 
} 
+1

Sei sicuro che il tuo dispositivo funzioni? Raramente vedo app che consentono questo. – DeeV

+0

Non ho visto questo comportamento con alcune app standard (Impostazioni, browser, ecc.) Che ho provato, ma è possibile con 'android: screenOrientation =" fullSensor "' –

risposta

7

Non è un problema, è come funziona Android. Vede sottosopra solo in modalità orizzontale e non in verticale (e in orizzontale dalla versione 2.2 se non ricordo male). Il cambio di configurazione avviene quando passa da verticale a orizzontale e viceversa. Se si desidera verificare se il telefono è stato capovolto o in qualsiasi direzione si dovrà accedere al sensore dell'accelerometro. Ecco un tutorial su come usarlo e qui hai SensorManager docs.

EDIT: come l'autore della domanda ha scoperto se stesso, aggiungendo android:screenOrientation="fullSensor" al vostro manifesto è sufficiente, a condizione che non si desidera supportare qualcosa di più grande di Android 2.3 (API di livello 9).

+0

Hai un collegamento al documento Android che descrive questo ? –

+2

In realtà, se aggiungo android: screenOrientation = "fullSensor" ottengo il comportamento desiderato. –

+0

Il problema è che non verrà eseguito su Android più vecchi di 2.3 (livello API 9). O mi sbaglio? L'hai provato? –

3

Includere Screensize nei tuoi configChanges nel mafifest:

android:configChanges="orientation|screenSize" 

Da http://developer.android.com/guide/topics/resources/runtime-changes.html:

A partire da Android 3.2 (livello API 13), anche le "dimensioni dello schermo" cambiano quando il dispositivo passa dall'orientamento verticale a quello orizzontale. Pertanto, se si desidera impedire il riavvio del runtime a causa della modifica dell'orientamento durante lo sviluppo per il livello API 13 o successivo (come dichiarato dagli attributi minSdkVersion e targetSdkVersion), è necessario includere il valore "screenSize" oltre al valore "orientation". Cioè, devi decalare android: configChanges = "orientation | screenSize". 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).

3

L'impostazione android:screenOrientation="fullSensor" esegue ciò che sto cercando di fare.

Problemi correlati