5

Devo gestire i cambiamenti di orientamento nella mia applicazione Android. A tale scopo ho deciso di utilizzare la classe di convenienza OrientationEventListener. Ma il suo metodo di callback ha un comportamento un po 'strano.Problemi nella gestione delle modifiche all'orientamento

La mia applicazione inizia in modalità verticale e quindi passa a quella panoramica. Ho qualche codice personalizzato in esecuzione nel metodo callback onOrientationChanged che fornisce una logica di gestione dell'interfaccia utente aggiuntiva - ha alcune chiamate a findViewById. Che è strano è che quando si passa di nuovo dal paesaggio al modo verticale onOrientationChanged callback viene chiamata due volte, e ciò che è peggio - la seconda chiamata a che fare con cattivoContext - metodo findViewById inizia il ritorno null. Queste chiamate sono fatte proprio dalla MainThread

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    listener = new OrientationListener(); 
} 

    @Override 
protected void onResume() {  
    super.onResume(); 
    // enabling listening 
    listener.enable(); 
} 
    @Override 
protected void onPause() { 
    super.onPause(); 
    // disabling listening 
    listener.disable(); 
} 

ho replicato lo stesso comportamento con un manichino Activity senza alcuna logica ad eccezione di uno che si occupa di orientamento hadling. Avvio dell'interruttore di orientamento dall'emulatore Android 2.2 premendo Ctrl + F11 Cosa potrebbe essere sbagliato?

Upd: classe interna che implementa OrientationEventListener

private class OrientationListener extends OrientationEventListener { 
    public OrientationL() { 
     super(getBaseContext()); 
    } 

    @Override 
    public void onOrientationChanged(int orientation) { 

     toString(); 

    } 
} 

}

+1

si prega di inviare il vostro codice onOrientationChanged troppo –

+1

Hai provato questo quando si verifica su un telefono vero e proprio? Ho avuto alcuni problemi con le modifiche all'orientamento che si sono verificate solo durante il test su un emulatore. Ha avuto qualcosa a che fare con l'emulatore falsa il cambio di orientamento dello schermo - Ho anche avuto un problema con esso ricreando l'app due volte. –

+0

Purtroppo non ho accesso al telefono reale per ora – nixau

risposta

5

Questo è un errore documentato nell'emulatore SOLO. Un dispositivo reale non mostrerà questo comportamento a doppio ciclo di vita degli eventi. Ho avuto lo stesso problema un po 'di tempo fa e scompare su un dispositivo reale.

Vorrei suggerire di ignorare il problema se è possibile solo testando i cambi di orientamento in una direzione finché non si ottiene un telefono fisico. Altrimenti potresti essere in grado di "saltare" il secondo set di chiamate del ciclo di vita mantenendo un booleano statico attorno ad indicare che hai già completato il primo set.

Vedere this issue report per ulteriori informazioni.

+0

ha avuto qualche problema su motorola xoom, onCreate viene chiamato anche due volte una riga http://stackoverflow.com/posts/3922257 – RzR

3

Hai provato a usare onConfigurationChanged?

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
if(newConfig.equals(Configuration.ORIENTATION_LANDSCAPE)… 
+0

Ho lo stesso problema con il metodo 'findViewById'. È strano ma sembra che il layout dichiarativo specificato nel file '.xml' non sia ancora stato reso. – nixau

+0

in ogni caso onConfigurationChanged sembra essere la soluzione migliore se confrontato con l'abbonamento callback OrientationEventListener – nixau

1

Aggiungi android: configChanges = "orientamento" nel file manifesto nel tag di attività come

<activity android:label="@string/app_name" android:configChanges="orientation" android:name=".com.androidpeople">