5

Ich muss verschiedene Layouts für Hoch-und Querformat meiner Aktivitäten anwenden. Außerdem muss ich alarmieren, wenn die Ausrichtung Porträt ist.Handhabung Aktivität rotierende in Android

Ich habe android:configChanges="orientation|keyboardHidden" in AndroidManifest angegeben. I außer Kraft setzen auch onConfigurationChanged Methode wie folgt:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    Log.d("tag", "config changed"); 
    super.onConfigurationChanged(newConfig); 

    int orientation = newConfig.orientation; 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) 
     Log.d("tag", "Portrait"); 
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.d("tag", "Landscape"); 
    else 
     Log.w("tag", "other: " + orientation); 

    .... 
} 

Während von Quer- auf Hochformat log rotierenden wie folgt aussieht:

config changed 
Portrait 

Aber während von Hoch- auf Querformat zu ändern sieht es aus wie

config changed 
Portrait 
config changed 
Landscape 

Warum onConfigurationChanged wird zweimal aufgerufen? Wie kann ich es vermeiden?

Antwort

3

Siehe meine Antwort auf eine andere Frage hier: https://stackoverflow.com/a/3252547/338479

Kurz gesagt, die Handhabung von Konfigurationsänderungen zu tun richtig hart ist. Am besten implementieren Sie onRetainNonConfigurationInstance(), das aufgerufen wird, kurz bevor Ihre Anwendung aufgrund einer Konfigurationsänderung angehalten und neu gestartet werden soll. Verwenden Sie diese Methode, um alles zu speichern, was Sie wollen ("das ist eine gute Wahl") und lassen Sie dann das System Ihre App abreißen.

Wenn Ihre App mit der neuen Konfiguration neu gestartet wird, verwenden Sie getLastNonConfigurationInstance(), um den gerade gespeicherten Status abzurufen, und verwenden Sie ihn, um Ihre Anwendung fortzusetzen, ohne mit Bundles und freigegebenen Voreinstellungen herumzuärgern.

0

Gibt es einen bestimmten Grund, warum Sie sich für die Rotation entschieden haben? Obwohl es schneller ist, da die Aktivität bei einer Orientierungsänderung nicht neu gestartet wird, wird sie normalerweise nicht empfohlen, wenn ich mich richtig erinnere. Eine weitere Möglichkeit, Orientierungsänderungen zu handhaben ist anstelle des überwiegenden , zwingende onCreate(), onStart() oder onResume() so dass

@Override 
public void onStart() { 
    super.onStart(); 
    int orientation = getWindowManager().getDefaultDisplay().getOrientation(); 
    if(orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Log.i(TAG, "Orientation is portrait"); 
     // show whatever alerts here 
    } 
} 

und dann spezifiziert zwei Layouts - eine für Portrait, eine für die Landschaft. Die Hochformatversion des Layouts würde bei res/layout/whatever.xml bleiben und die Landschaftsversion würde in res/layout-land/whatever.xml leben. Die AndroidGuys hatte ein paar gute Artikel zu diesem Thema geschrieben, siehe http://androidguys.com/?s=rotational+forces&x=9&y=9

+0

Warum onConfigurationChanged() ist ein schlechter Weg? Könnten Sie mir bitte einen Link zur Erklärung geben? Wenn ich onCreate() oder etwas ähnliches verwenden wird, wird die Aktivität neu erstellt und ihre Daten gehen verloren. – darja

0

Ich bin ziemlich sicher, Sie eher als onStart verwenden onCreate möchte. Der einzige Unterschied scheint zu sein, dass onStart aufgerufen wird, wenn die Anwendung in den Vordergrund kommt. Das wäre kein Fall, bei dem Sie den Benutzer warten lassen sollten, bis Sie die Benutzeroberfläche neu initialisieren. Andernfalls ändern Sie einfach Ihren Aufruf von setContentView basierend auf der Bedingung if.

+0

Ich stimme zu, die onCreate-Methode wird aufgerufen, wenn sich die Ausrichtung des Geräts ändert –

+0

Warum ist es besser, onConfigurationChanged? – darja

+0

Ich glaube, du wirst in diesem Fall die Benutzeroberfläche zweimal erstellen. Sowohl onConfigurationChange als auch onCreate werden aufgerufen, wenn sich der Bildschirm dreht. Sie müssen die Benutzeroberfläche bereits in onCreate für alle anderen Erstellungssituationen einrichten. – JOTN

0

Android startet eine neue Instanz Ihrer Aktivität, wenn Sie die Ausrichtung ändern, daher ist onCreate die ideale Methode. Sie müssen die Daten Ihrer Aktivität offensichtlich speichern/wiederherstellen, damit Sie dort weitermachen können, wo Sie aufgehört haben - aber Sie sollten dies trotzdem tun, da eine beliebige Anzahl von Ereignissen Ihre Anwendung nicht fokussieren/töten kann.

+0

Warum die downvotes? Er hat recht. –

1

Sie können einfach die vorherige Ausrichtung speichern und überprüfen, ob sie sich wirklich geändert hat.

Wenn Sie android:configChanges-keyboardHidden|orientation für Ihre Tätigkeit in AndroidManifest.xml gesetzt, onCreate etc ... wird nicht aufgerufen werden. Dies macht die Implementierung wesentlich einfacher zu implementieren. Aber natürlich ändert sich auch das Layout von Portrait zu Landscape.