Verschiedene Android Layouts in Abhängigkeit des Screens

TL;DR: die Ordner-Suffixe für Density, Screen-Größe und Orientation funktionieren nicht nur bei layout und drawable-Ordnern, sondern bei allen. So braucht man für kleinere Anpassungen im Layout nicht das komplette XML zu kopieren sondern lagert einfach die Werte in values-XMLs aus.

Ein Beispiel: beim Wechseln von Portrait in Landscape sind kleinere Designanpassungen oft nicht zu vermeiden, und um dabei nicht das komplette XML Layout kopieren zu müssen, (vor allem wenn sich das grundlegende Layout nicht ändert) können einzelne Werte auch ausgelagert werden.

In den Android Developer Guidelines sind die verschiedenen Identifier zu finden mit denen man seine Layouts für die verschiedenen Screen-Eigenschaften anlegen kann. Allerdings erschien es mir immer etwas unpraktisch (und bei Änderungen auch sehr Fehleranfällig) das komplette XML zu kopieren um nur wenige Werte zu ändern. Heute kam dann die Erkenntnis: die Identifier werden nicht nur für die Layout-Ordner akzeptiert, sondern für alle Unterordner!

Also kann man neben dem “values” Ordner mit den Defaultwerten z.B. auch einen “values-land” (für Landscape) Ordner erstellen. Wenn man kein neues XML erstellen möchte, bietet sich die dimens.xml an, um die entsprechenden Werte unterzubringen. Hier im Konkreten Fall, die layout_weight eines LinarLayouts

<!-- res/values/dimens.xml -->
<resources>
<item type="integer" name="element_weight">.8</item>
</resources>	

<!-- res/values-land/dimens.xml -->
<resources>
<item type="integer" name="element_weight">.6</item>
</resources>

<!-- res/layout/activity_main.xml -->
...
<LinearLayout
			android:layout_weight="@integer/video_element_width_percentage"
			android:layout_width="0dp"
			android:layout_height="wrap_content" >
</LinearLayout>
...

Um dp oder sp Werte zu speichern kann das <dimen> Tag benutzt werden

<dimen name="image_padding_top">15dp</dimen>

Die Werte in den Ordnern ohne Suffix sind dabei immer Default und Fallback.

Last posts

Tags