5

Ich muss mit Orientierungsänderungen in meiner Android-Anwendung umgehen. Zu diesem Zweck habe ich mich entschieden, OrientationEventListener Convenience-Klasse zu verwenden. Aber seine Callback-Methode hat ein seltsames Verhalten.Probleme beim Umgang mit Orientierungsänderungen

Meine Anwendung startet im Hochformat-Modus und wechselt schließlich zur LANScape One. Ich habe einige benutzerdefinierte Code in der Callback-Methode onOrientationChanged ausgeführt, die einige zusätzliche UI-Handling-Logik bietet - es hat ein paar Aufrufe an findViewById. Was seltsam ist, dass bei der Wiedergabe von Querformat auf Hochformat onOrientationChanged Rückrufe zweimal aufgerufen Umschalten, und was noch schlimmer ist - der zweite Anruf wird mit schlechtContext tun - findViewById Methode beginnt null zurück. Diese Anrufe sind aus rechts von der 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(); 
} 

ich das gleiche Verhalten mit einem Dummy Activity ohne Logik repliziert haben mit einer Ausnahme, die mit Orientierung hadling beschäftigt. Ich initiiere Orientierungsschalter vom Android 2.2 Emulator durch Drücken von Strg + F11 Was könnte falsch sein?

Upd: Inner-Klasse, die OrientationEventListener

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

    @Override 
    public void onOrientationChanged(int orientation) { 

     toString(); 

    } 
} 

implementiert}

+1

bitte posten Sie Ihre onOrientationChanged Code zu –

+1

Haben Sie versucht, wenn sie auf einem echten Handy testen? Ich hatte einige Probleme mit Orientierungsänderungen, die nur beim Testen auf einem Emulator passiert sind. Es hatte etwas damit zu tun, dass der Emulator die Bildschirmausrichtung verändert - ich hatte auch ein Problem damit, die App zweimal neu zu erstellen. –

+0

Leider habe ich keinen Zugriff auf echte Telefon für jetzt – nixau

Antwort

5

Dies ist NUR ein dokumentierter Fehler im Emulator. Ein echtes Gerät wird dieses Verhalten des Doppellebenszyklus-Ereignisses nicht aufweisen. Ich hatte das gleiche Problem vor einer Weile und es verschwindet auf einem echten Gerät.

Ich würde vorschlagen, das Problem zu ignorieren, wenn Sie nur Orientierungsänderungen in einer Richtung testen können, bis Sie Ihre Hände auf ein physikalisches Telefon bekommen. Andernfalls können Sie möglicherweise die zweite Reihe von Lifecycle-Aufrufen "überspringen", indem Sie einen statischen Booleschen Wert beibehalten, um anzuzeigen, dass Sie den ersten Satz bereits durchlaufen haben.

Weitere Informationen finden Sie unter this issue report.

+0

hatte einige Probleme auf Motorola Xoom, onCreate wird auch zweimal hintereinander Zeile http://stackoverflow.com/posts/3922257 – RzR

3

Haben Sie versucht onConfigurationChanged mit?

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

Ich bekomme das gleiche Problem mit 'findViewById' Methode. Es ist seltsam, aber anscheinend hat das deklarative Layout, das in der '.xml' Datei angegeben ist, noch nicht gerendert. – nixau

+0

sowieso OnConfigurationChanged scheint eine bessere Lösung zu sein, wenn sie mit OrientationEventListener Callback-Abonnement – nixau

1

hinzufügen android: configChanges = "Orientierung" in Manifest-Datei in Aktivitäts-Tag wie

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