05 Mai

Problem beim Wechsel der Ausrichtung

Wenn man f├╝r das Android OS programmiert und dann seine eigenen Grafiken erstellt und zeichnet, dann kann es vorkommen, dass bei dem Wechsel der Ausrichtung (orientation) von Landscape zu Portait oder umgekehrt das Programm eine Exception wirft und dann abst├╝rzt. Warum ist das so?

Ich bin ja ebenfalls ein Neuling in der Android Entwicklung, programmiere nun aber seit 6 Jahren professionell und habe teifgreifendes Wissen und Erfahrungen in den g├Ąngisten Programmier- und Scriptsprachen, nat├╝rlich auch in Java, das f├╝r die Android Entwicklung ben├Âtigt wird.
Aber das folgenden Problem hat mich echt besch├Ąftigt. F├╝r mein anstehendes Tutorial ├╝ber die Einf├╝hrung in die Grafikprogrammierung unter Android habe ich eine kleine Testapp entwickelt. Dabei ist mir jedesmal beim Wechsel der Orientation von dem Portrait in den Landscape Mode das Programm abgest├╝rzt. Nach ein paar Pr├╝fungen in der LogCat habe ich die Exception OutOfMemory bei der Erstellung meines Hintergrundes gefunden.
Das hat mich stutzen lassen, weil ich diesen Hintergrund nur einmal erzeuge (also puffere) und dann immer wieder auf das Graphics Objekt zeichne. Aus welchem Grund also, sollte sich das Objekt beim Wechsel der Ausrichtung von den Port├Ąt in den Landschaftsmodus neu erstellen? Nach einigem forschen fand ich die Ursache bei developer.android.com im Thema Avoiding Memory Leaks (Speicherl├Âcher vermeiden).

When the screen orientation changes the system will, by default, destroy the current activity and create a new one while preserving its state.

Wie bitte? Beim Wechsel der Ausrichtung wird die Activity neu gestartet? Alle Variablen, die man in seiner Activity hat, werden also zur├╝ckgesetzt und alle Berechnungen sind verloren. Auf der Seite wird noch der Vorschlag gegeben die Daten in einem extra Objekt zu speichern und beim Neustart diese wieder zu laden.
Wer kommt denn bitte auf solch eine Idee? Warum sollte man die Activity neustarten? Da hat wohl einer zu tief ins Glas geschaut als diese Idee kam.
Gott sei Dank gibt es in dem Satz noch den Zusatz „by default“. Man scheint das Verhalten des Neustarts der Activity verhindern zu k├Ânnen. Nach einigem weiteren forschen bin ich auf ein Attribut der Activity gesto├čen. Mit dem Attribut „configChanges“ kann man Konfigurationen aktivieren beziehungsweise deaktivieren. Die entsprechenden Werte die uns interessieren sind „orientation“, weil wir auf ├änderungen von der Ausrichtung nicht reagieren wollen und „keyboardHidden“, f├╝r den Fall, dass eine Tastatur exisitert, soll beim nutzen dieser auch keine Ausrichtungs├Ąnderung ausgel├Âst werden soll.
Der folgende Teil kann also genutzt werden, um das Neustarten der Activity beim Ändern der Orientation verhindern :

android:configChanges="orientation|keyboardHidden"
 

Dieser Codeschnipsel muss im Element Activity im AndroidManifest.xml hinzugef├╝gt werden.

Ich hoffe ich konnte einigen eine Menge Sucharbeit ersparen. Falls irgendjemand wei├č wieso man auf eine solch sinnfreie Idee wie dem Neustarten der Activity kommt, den w├╝rde ich bitten dieses Wissen in den Kommentaren mit mir zu teilen.




Keine Kommentare zu “Problem beim Wechsel der Ausrichtung”

  1. 1
    Jens sagt:

    Anmerkung : Der Grund ist mir nat├╝rlich bewu├čt, man m├Âchte die entsprechende Layout XML f├╝r die Ausrichtung laden, aber warum wird das nicht ├╝ber ein Reload oder sowas erledigt?

Hinterlasse ein Kommentar