Warum nicht immer android: configChanges = "keyboardHidden | Orientierung" verwenden?


177

Ich habe mich gefragt, warum ich nicht android:configChanges="keyboardHidden|orientation"in jeder (fast jeder;)) Aktivität verwenden soll.

Waren:

  • Sie müssen sich keine Sorgen machen, dass Ihre Aktivität gedreht wurde
  • es ist schneller

Nicht so schön:

  • Sie müssen Ihre Layouts ändern, wenn sie von der Bildschirmgröße abhängen (z. B. Layouts mit zwei Spalten oder so).

Schlecht:

  • Keine flexible Möglichkeit, unterschiedliche Layouts mit unterschiedlicher Ausrichtung zu erstellen
  • nicht so gut bei der Verwendung von Fragmenten

Aber wenn wir keine unterschiedlichen Layouts verwenden, warum nicht?


6
Sie sollten auch erklären, was Ihrer Meinung nach tastaturversteckte | Orientierung tut
Blundell

Es verhindert, dass die native Behandlung bestimmter Konfigurationsänderungen verwendet wird, und ermöglicht es der Anwendung, damit umzugehen, nicht wahr?
Mikooos

2
Aus diesem Grund ist diese Option verfügbar. Wenn Sie wissen, was Sie tun (keine Änderungen an den Ressourcen), verwenden Sie sie.
Zeiger Null

Warum ist es schneller als ScreenSize?
Batmaci

Antworten:


333

Schneller Hintergrund

Wenn bestimmte wichtige Konfigurationsänderungen unter Android vorgenommen werden (ein häufiges Beispiel ist eine Änderung der Ausrichtung), startet Android die ausgeführte Aktivität standardmäßig vollständig neu, um sie an solche Änderungen anzupassen.

Wenn Sie android:configChanges="keyboardHidden|orientation"in Ihrem AndroidManifest definieren , sagen Sie Android: "Bitte führen Sie den Standard-Reset nicht durch, wenn die Tastatur herausgezogen oder das Telefon gedreht wird. Ich möchte dies selbst erledigen. Ja, ich weiß, was ich tue." ""

Ist das eine gute Sache? Wir werden bald sehen ...

Keine Sorge?

Einer der Profis, mit denen Sie beginnen, ist, dass es Folgendes gibt:

Sie müssen sich keine Sorgen machen, dass Ihre Aktivität gedreht wurde

In vielen Fällen glauben Menschen fälschlicherweise, dass sie einen Fehler, der durch eine Orientierungsänderung ("Rotation") erzeugt wird, einfach durch Einfügen beheben können android:configChanges="keyboardHidden|orientation".

Android: configChanges = "keyboardHidden | Orientierung" ist jedoch nichts anderes als ein Pflaster. In Wahrheit gibt es viele Möglichkeiten, wie eine Konfigurationsänderung ausgelöst werden kann. Wenn der Benutzer beispielsweise eine neue Sprache auswählt (dh das Gebietsschema hat sich geändert), wird Ihre Aktivität auf die gleiche Weise neu gestartet wie durch eine Änderung der Ausrichtung. Wenn Sie möchten, können Sie eine Liste aller verschiedenen Arten von Konfigurationsänderungen anzeigen .

Bearbeiten : Noch wichtiger ist jedoch, dass, wie Hackbod in den Kommentaren hervorhebt , Ihre Aktivität auch neu gestartet wird, wenn sich Ihre App im Hintergrund befindet und Android beschließt, Speicherplatz freizugeben , indem es sie beendet. Wenn der Benutzer zu Ihrer App zurückkehrt, versucht Android, die Aktivität auf die gleiche Weise neu zu starten, wie dies bei einer anderen Konfigurationsänderung der Fall war. Wenn Sie damit nicht umgehen können, wird der Benutzer nicht glücklich sein ...

Mit anderen Worten, die Verwendung android:configChanges="keyboardHidden|orientation"ist keine Lösung für Ihre "Sorgen". Der richtige Weg ist, Ihre Aktivitäten so zu codieren, dass sie mit jedem Neustart von Android zufrieden sind. Dies ist eine gute Vorgehensweise, die Ihnen später helfen wird. Gewöhnen Sie sich also daran.

Wann sollte ich es verwenden?

Wie Sie bereits erwähnt haben, gibt es einen deutlichen Vorteil. Das Überschreiben der Standardkonfigurationsänderung für eine Rotation durch selbstes Behandeln beschleunigt die Arbeit. Diese Geschwindigkeit ist jedoch mit einem Preis für Bequemlichkeit verbunden.

Um es einfach auszudrücken: Wenn Sie für Hoch- und Querformat dasselbe Layout verwenden, sind Sie durch Überschreiben in guter Verfassung. Anstelle eines vollständigen Neuladens der Aktivität werden die Ansichten einfach verschoben, um den verbleibenden Platz zu füllen.

Allerdings , wenn Sie aus irgendeinem Grunde ein anderes Layout verwenden , wenn das Gerät im Querformat ist die Tatsache , dass Android Ihre Aktivität neu geladen ist gut , weil es dann das richtige Layout laden. [Wenn Sie die Überschreibung für eine solche Aktivität verwenden und zur Laufzeit ein magisches Neulayout durchführen möchten ... nun, viel Glück - es ist alles andere als einfach]

Kurze Zusammenfassung

Wenn android:configChanges="keyboardHidden|orientation"es für Sie richtig ist, verwenden Sie es auf jeden Fall . Aber BITTE sicher sein , zu testen , was passiert , wenn etwas ändert, da eine Orientierungsänderung nicht der einzige Weg ist , kann eine volle Aktivität Neustart ausgelöst werden.


50
Es ist erwähnenswert, dass Sie größere Probleme haben, wenn Sie Ihre Aktivität beim Neustart nicht behandeln, als wenn Sie nicht weniger häufige Konfigurationsänderungen behandeln. Der hier verwendete Aktivitätsneustart entspricht genau dem Mechanismus, mit dem Android Ihre Aktivität auf den vorherigen Status zurücksetzt, wenn Ihre App im Hintergrund beendet wird. Wenn Sie dies also nicht richtig machen, werden Ihre Benutzer feststellen, dass Ihre App zufällig nicht richtig zurückkehrt, wenn sie aus dem Hintergrund darauf zurückgreifen, je nachdem, ob der Prozess gerade abgebrochen wurde. Ein großer Vorteil: Es stellt sicher, dass Ihre App korrekt neu gestartet wird.
Hackbod

14
Verpassen Sie nicht, ab Android 3.x "screenSize" hinzuzufügen ---------- android: configChanges = ["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientierung", "screenSize", "kleinsteScreenSize"]
Michael Biermann

1
Ich habe festgestellt, dass Ihre App bei Verwendung des Attributs configChanges auch die Orientierungssperrfunktion ignoriert. Wie können Sie das lösen? Wenn Sie die Antwort kennen, schreiben Sie sie bitte hier: stackoverflow.com/questions/24000361/…
Android-Entwickler

4
Please don't do the default reset when the keyboard is pulled outIch habe noch nie einen Neustart der Aktivität für das Herausziehen der Tastatur gesehen !
Muhammad Babar

Nun, gelegentliche Neustarts sind meiner Meinung nach in Ordnung ... configChanges behandelt die meisten Fälle für mich ... nun, vielleicht kann dies bei anderen Anwendungen in Anwendungen ein Problem sein, aber es hängt wirklich davon ab ...
Renetik

2

Aus meiner Sicht: Wenn das Layout sowohl im Quer- als auch im Hochformat gleich ist, können Sie auch eine der beiden Optionen in Ihrer App deaktivieren.

Der Grund, warum ich dies sage, ist, dass ich als Benutzer erwarte, dass die App mir einen gewissen Nutzen bringt, wenn ich die Ausrichtung ändere. Wenn es keine Rolle spielt, wie ich mein Telefon halte, brauche ich keine Wahl.

Nehmen Sie zum Beispiel eine App, in der Sie eine ListView haben, und wenn Sie auf ein ListItem klicken, möchten Sie eine detaillierte Ansicht für dieses Element erhalten. Im Querformat können Sie dies tun, indem Sie den Bildschirm in zwei Teile teilen, wobei die ListView links und die Detailansicht rechts angezeigt werden. In Portrait haben Sie die Liste auf einem Bildschirm und ändern dann den Bildschirm in die Detailansicht, wenn ein ListItem ausgewählt ist. In diesem Fall ist eine Änderung der Ausrichtung sowie unterschiedliche Layouts sinnvoll.


4
Ja, wir haben das in Version 1.0 unserer App verwendet, um es an unsere Apple-Version anzupassen. Es wurde NUR im Porträt präsentiert. Was auf meinem Droid X großartig aussah, haben wir genau auf das Popup-Tastaturverhalten der IOS-Version abgestimmt. Dann installierte der CFO die App auf seinem Droid, drehte sie zur Seite und schob die Tastatur auf. Hoppla. Die Sache mit Android ist, dass es eine offene Plattform ist und Sie wirklich nicht vorhersagen können, welche Hardwarekonfiguration oder was der Benutzer damit machen möchte. Daher sollten Sie wahrscheinlich beide (alle) Ausrichtungen für alle Fälle unterstützen.
Tevo D

1
Was im Übrigen unsere Nur-Porträt-Einstellung außer Kraft setzte, da die Landschaft im Grunde genommen in der Hardware die normale, nicht alternative Ausrichtung war. Was unser Layout WIRKLICH durcheinander gebracht hat :( und war ziemlich peinlich, da er innerhalb von Sekunden nach der Installation der App einen großen Fehler hatte
Tevo D.

1
Warum haben Sie versucht, es genau wie iOS zu verhalten? :(
FunkTheMonk

7
@FunkTheMonk Leider leben wir in einer Welt, in der Geschäftsleute technische Entscheidungen treffen. Selbst wenn Sie dagegen argumentieren, denken sie die Hälfte der Zeit, dass sie sowieso Recht haben. Und sie kontrollieren Ihren Gehaltsscheck.
StackOverflowed

2
Die Verwendung nur eines Layouts bedeutet nicht, dass der Bildschirm beim Drehen gleich aussieht. Ein gut strukturiertes XML-Layout führt dazu, dass sich die Dinge automatisch verschieben, um mit angemessenen Abmessungen gut zu funktionieren, und die Benutzer werden dies zu schätzen wissen.
Melinda Green

-1

Ich verstehe nicht warum ... gelegentliche Neustarts sind meiner Meinung nach in Ordnung ... configChanges behandelt die meisten Fälle für mich ... nun, vielleicht kann dies in einigen Arten von Anwendungen ein Problem sein, aber es hängt wirklich von der Art der App ab und davon, wie Sie sie wiederherstellen Zustand beim Neustart der App ... Wenn einer meiner App neu gestartet wird, wird der Benutzer zurückgemeldet und die letzte Aktivität wird durch meinen Code geöffnet, und der Benutzer verliert einige Schritte, um dorthin zurückzukehren, wo er war, aber keine große Sache. In einem anderen Zustand bleibt der Zustand immer bestehen und Ein Zustand wird beim Neustart immer wiederhergestellt. Beim Neustart der Aktivität musste es sein, dass die App nicht verwendet wurde oder so ... also überhaupt kein Problem ... Im Spiel kann dies beispielsweise ein Problem sein oder in einer anderen Art von App, die ich nicht kenne ...

Ich sage, wenn Sie dies auf diese Weise tun, funktionieren Anwendungen unter normalen Umständen einwandfrei. Und Code ist viel besser lesbar, ohne dass jede Menge Logik zum Speichern und Wiederherstellen benötigt wird, wo Sie nur neue Fehler machen können und ihn die ganze Zeit warten müssen ... sicher, wenn Android aus der Stromversorgung gerät und Ihr Anwendungsfenster beendet, verliert es den Kontext und fängt wieder an, aber das passiert nur in besonderen Situationen und auf neueren Geräten glaube ich, dass dies immer seltener wird ...

Also töte mich, aber ich benutze dies für alle Anwendungen ziemlich erfolgreich ... android: configChanges = "Gebietsschema | Tastatur | Tastatur versteckt | Ausrichtung | Bildschirmlayout | uiMode | Bildschirmgröße | kleinste Bildschirmgröße" Aber ich verstehe, dass dies für eine bestimmte Art von Anwendungen möglicherweise nicht der Fall ist Guter Weg, aber die meisten Apps können damit leben, nur OK.


Hallo, kann jemand, der sich mit diesem Thema auskennt, einen Blick auf meinen Thread werfen: stackoverflow.com/questions/35941585/…? Brauche dringend Hilfe.
Luke Allison

Sie sollten das Speichern / Fortsetzen von Aktivitäten voll unterstützen ... die Handhabung für die Rotation ist nicht anders ... Sie sagen, Sie verlieren ein paar Schritte ... Wenn Sie es richtig machen, verlieren Sie keine Schritte und stellen genau dort wieder her, wo der Benutzer aufgehört hat ... auch nach Neustart des Gerätes.
HaMMeReD

Ich weiß nicht, wovon Sie sprechen, aber ich sage, wenn Sie dies auf diese Weise tun, funktionieren Anwendungen unter normalen Umständen einwandfrei. Und Code ist viel besser lesbar, ohne dass jede Menge Logik zum Speichern und Wiederherstellen benötigt wird, wo Sie nur neue Fehler machen können und ihn die ganze Zeit warten müssen ... sicher, wenn Android aus der Stromversorgung gerät und Ihr Anwendungsfenster beendet, verliert es den Kontext und fängt wieder an, aber das passiert nur in besonderen Situationen und auf neueren Geräten glaube ich, dass dies immer seltener wird ...
Renetik

Das Ignorieren der Einhaltung des Aktivitätsvertrags (Speichern / Wiederherstellen des Status) ist eine schlechte Praxis, und dies ist insgesamt ein schrecklicher Rat. Versuchen Sie, gegen Prozesstod zu testen, und ermitteln Sie, wohin Ihre App Sie führt. Dieses Verhalten ist ein normaler "normaler Umstand", wenn Ihr Benutzer mindestens 2-3 Apps auf seinem Telefon verwendet und zwischen diesen wechselt.
EpicPandaForce

-3

Ja, ich denke, eine Pause macht es schneller als das Loslassen des Players. Habe trotzdem die Pause.

Habe jetzt eine Lösung gefunden, die das Lied nicht pausiert.

Geben Sie im Manifest an, dass Sie die Konfigurationsänderung für die Bildschirmausrichtung behandeln, und verwenden Sie dann die onConfigurationChanged-Methode, um die Layoutdatei zu laden. Auf diese Weise kann ich in logCat sehen, dass onPause, onCreate & onResume nicht aufgerufen werden und der Song daher nicht angehalten wird.

  1. Aktualisieren Sie das Manifest, um die Ausrichtung zu handhaben.

    android:configChanges="orientation|screenSize"
  2. Fügen Sie diesen Code hinzu

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }

Sie sollten einen Dienst zum Abspielen von Musik verwenden. Im Ernst, Sie fordern die Leute auf, Code hinzuzufügen, der noch "// TODO Automatisch generierter Methodenstub" enthält. Schlampige Lösung. Es wird auch nicht gut funktionieren, Sie müssen alle Ihre Referenzen neu binden, und wenn Sie dies nicht tun, werden sie bestenfalls unvorhersehbar sein.
HaMMeReD
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.