2011-04-20 14 views
82

Ho appena implementato la funzione di modifica dell'orientamento.Come rilevare il cambiamento di orientamento nel layout in Android?

Quando il layout cambia da verticale a orizzontale (o viceversa), come posso rilevare quando l'evento di modifica dell'orientamento è terminato.

Ho provato a utilizzare OrientationEventListener, ma non sembra una buona idea.

Voglio solo essere avvisato solo quando l'orientamento del layout cambia. Come farlo? Metodo

+0

Nel mio caso, onCreate() è stato chiamato quando cambia l'orientamento. –

risposta

238

Utilizzare il onConfigurationChanged metodo di attività. Vedere il seguente codice:

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

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
     Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    } 
} 

È inoltre necessario modificare il appropriata elemento nel file manifest per includere il Android: configChanges Basta vedere il codice qui sotto:

<activity android:name=".MyActivity" 
      android:configChanges="orientation|keyboardHidden" 
      android:label="@string/app_name"> 

NOTA: con Android 3.2 (livello API 13) o superiore, 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 di cambiamenti di orientamento durante lo sviluppo per il livello API 13 o superiore, è necessario dichiarare android: configChanges = "orientation | screenSize" per livello API 13 o superiore.

Spero che questo vi aiuterà a ... :)

+3

Questo è buono, ma non carica il layout xml nella cartella layout-land utilizza i file di layout portrait xml. – Programmer

+17

Aztec Coder, quando si include "android: configChanges =" orientation "si dichiara che si gestirà la modifica dell'orientamento, il che significa che l'attività non verrà ricreata quando si passa all'orientamento orizzontale, ma viene chiamato onConfigurationChanged. indesiderato, è possibile utilizzare una variabile per ricordare l'orientamento della propria attività e ogni volta che si va in pausa (ad esempio) per verificare se l'orientamento è sempre lo stesso – Elena

+0

se in Android sono specificati più elementi: configChanges, in qualsiasi modo per distinguerli ? – njzk2

11

Per caricare il layout nella cartella layout terra significa che avere due layout separati, allora si deve fare in setContentViewonConfigurationChanged metodo.

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

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     setContentView(R.layout.yourxmlinlayout-land); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
     setContentView(R.layout.yourxmlinlayoutfolder); 
    } 
} 

Se si dispone di un solo layout quindi non necessario fare setContentView in questo metodo. semplicemente

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

Invece di eseguire l'override, basta usare il layout/main.xml e layout-land/main.xml. –

+0

@JaredBurrows: vedere http://stackoverflow.com/questions/23789605/why-is-my-orientation-change-going-unnoticed –

+0

Volevo rilevare che la mia attività era stata interrotta a causa di una rotazione dello schermo. Ho implementato il metodo 'onConfigurationChanged (Configuration newConfig)' (come in questa risposta), ma piuttosto che gestirlo da solo, ho impostato un flag booleano e poi ho chiamato il metodo 'recreate()' in modo che Android ricreasse l'attività nel suo modo normale . – dazed

11

Volevo solo mostrare un modo per salvare tutto il vostro Bundle dopo onConfigurationChanged:

Crea nuovo Bundle subito dopo la vostra classe:

public class MainActivity extends Activity { 
    Bundle newBundy = new Bundle(); 

Avanti, dopo "protected void onCreate" aggiungi:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
      onSaveInstanceState(newBundy); 
     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
      onSaveInstanceState(newBundy); 
     } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putBundle("newBundy", newBundy); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    savedInstanceState.getBundle("newBundy"); 
} 

Se aggiungi tutte le classi in corso su MainAc la tensione sarà salvata.

Ma il modo migliore è quello di aggiungere questo nel vostro AndroidManifest:

<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/> 
+6

Questo è fuorviante. L'implementazione di 'onConfigurationChanged()' fa in modo che il tuo instanceState non venga distrutto quando l'orientamento cambia, quindi non devi salvarlo. Si consiglia di salvarlo per altri eventi nel ciclo di vita delle attività, ma non lo so. – izzy

2

uso questo metodo

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
    { 
     Toast.makeText(getActivity(),"PORTRAIT",Toast.LENGTH_LONG).show(); 
     //add your code what you want to do when screen on PORTRAIT MODE 
    } 
    else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    { 
     Toast.makeText(getActivity(),"LANDSCAPE",Toast.LENGTH_LONG).show(); 
     //add your code what you want to do when screen on LANDSCAPE MODE 
    } 
} 

E non dimenticate di aggiungere questo nella vostra Androidmainfest.xml

android:configChanges="orientation|screenSize" 

come questo

<activity android:name=".MainActivity" 
      android:theme="@style/Theme.AppCompat.NoActionBar" 
      android:configChanges="orientation|screenSize"> 

    </activity> 
Problemi correlati