Layout anpassen für jede Auflösung/API

  • Antworten:11
Michele
  • Forum-Beiträge: 1.525

30.06.2012, 15:05:54 via Website

Hallo alle zusammen.

Habe schon gesucht hier im Forum aber irgendwie nichts gefunden =/.

Frage mich wie man das Layout so anpassen kann das es für jede Auflösung/API sich selbs anpasst.
Z.B nehme ich zum testen einige ImageButtons und passe sie am API/Auflösung 720p (4,7 oder 4,8 zoll) an.
Teste ich es dann auf ein Handy mit nur z.B 3,7zoll oder noch kleiner dann ist immer weniger drau von den ImageButtons.
Anstatt das es angepasst wird und einfach kleiner gemacht wird???
Kann ich da was ändern? Benutze immer RelativLayout. Soll am besten sein??
Oder wie muss ich vorgehen?


LG

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

30.06.2012, 19:07:27 via Website

Nachdem du kein Beispiel zeigst, nehme ich mal an das du ein Layout meinst, bei dem "normal" große Images zB eine ganze Zeile ausfüllen.

Dieses Layout funktioniert dann grundsätzlich auch für kleinere Screens, allerdings musst du dafür dann Grafiken in drawable-ldpi bereitstellen, die entsprechend kleiner sind.

Umgekehrt geht es zur Not automatisch: wenn die Grafiken in drawable liegen und du auf einem hdpi Screen testest, dann nimmt Android die Grafiken aus dem drawable Ordner, wenn sie im drawable-hdpi nicht gefunden werden und vergrößert sie entsprechend; das passt dann vom Platz her, die Grafiken sind aber dann natürlich leicht unscharf.

Antworten
Michele
  • Forum-Beiträge: 1.525

30.06.2012, 19:48:06 via Website

Naja sagte ja eigentlich paar ImageButtons.
Aber ok mache ich genauer.
Stell dir ein ImageButton haufen vor wie bei dem spiel Memory.
Hast ca. 20 ImageButton 5x4 in der reihe.

Beim 4,7zoll Handy siehst du z.B alle.
Beim 3,7zoll Handy leider nur noch 15.

Jetzt möchte ich das er aber bei jeder Auflösung alle anzeigt.
Nur halt kleiner versetzt.

Die größe habe ich alle angepasst bei jeden drawable+hdpi usw.


LG

Antworten
Maximilian O
  • Forum-Beiträge: 990

30.06.2012, 20:10:57 via App

Schau dir mal LinearLayout in Verbindung mit layout_weight an.

Liebe Grüße Maximilian

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Michele
  • Forum-Beiträge: 1.525

30.06.2012, 21:12:45 via Website

Danke dir. Mache ich gleich mal.
Gibt es nicht sonst eine möglichkeit irgendwie das ich für jede auflösung ein extra layout erstelle
und die Activity sich dazu anpasst und sich das richtige raussucht? setContentView(R.layout.layout);
Oder ich mehrere Activitys mache dafür und dann setContentView(R.layout.layout), setContentView(R.layout.layout1) usw?



LG

Antworten
Michele
  • Forum-Beiträge: 1.525

01.07.2012, 08:04:39 via Website

Ja den link habe ich mir auch schon angeguckt. Einiges versucht aber brachte nichts. Oder ich bin wieder zu doof.

Wie macht ihr das denn alle für eure Programme?
Muss ja irgendwie gehen?


LG

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

01.07.2012, 08:59:38 via App

ManuMaticx
Für jede Auflösung ein Layout zu erstellen ist falsch. Du solltest ein Layout für alle Auflösungen erstellen!

Ich glaube Ihr beide redet aneinander vorbei.

@Michelle: Normalerweise hast Du ein einzelnes Layout pro Seite (plus eines pro Row im Falle einer ListView). Ich erkläre das an Hand der Activities (keine Custom Views, keine Fragments, ...). Dieses eine Layout sowie darin enthaltene Bilder liegen in den Ressourcenordner layout respektive drawable.

Kommt die App auf verschiedenen Auflösungen zur Anzeige, dann sucht das System nach speziell angepassten Layouts/Drawables. Diese müssten von Dir in den Ordnern mit den Extensions bereitgestellt werden (z.B. layout-land für Landscape). Gibt es den speziellen Ordner nicht so versucht das System das Beste daraus zu machen. Solange man in dem Layout keine festen Pixel o.ä. verwendet hat klappt das auch ganz gut. Bilder können dadurch aber gestaucht, gestretched, etc. werden.

Willst Du es perfekt machen so erstellst Du für verschiedene Auflösungen verschiedene Layouts/Drawables gleichen Namens und verteilst diese auf die speziell benannten Ressourcenordner.

Du endest somit mit mehreren Layouts/Drawables gleichen Namens mit jeweils verschiedenen Inhalten die durch eine einzige Zeile in Deinem Code geladen werden. Das System wählt das jeweils passende selbstständig.

Deine Aufgabe besteht also, wenn Du von dem universellen Layout/Drawable weg willst, im Bereitstellen von weiteren angepassten Layouts/Drawables in den Spezialordnern. Am Code musst Du nichts ändern.

Wenn Du Hilfe brauchst geht das nur mit dem XML Layout.

Antworten
Gelöschter Account
  • Forum-Beiträge: 80

01.07.2012, 12:58:27 via Website

Also für das Beispiel Memory (5x4) würde ich auch ein LinearLayout verwenden und jedem ImageButton 1/5 Breite und 1/4 Höhe geben. Und, wie gesagt, die Bilder in verschiedenen Auflösungen bereitstellen.

Vielleicht wäre aber auch ein GridLayout etwas für dich!?

Die Skalierung der Bilder kannst du übrigens mit "android:scaleType" auch noch beeinflussen.

Antworten
Michele
  • Forum-Beiträge: 1.525

02.07.2012, 02:46:46 via Website

@ Harald: Danke dir :*)

Z.B habe ja nun wie hier beschrieben alle ordner angelegt die wichtig sind.

1res/layout/my_layout.xml // layout for normal screen size ("default")
2res/layout-small/my_layout.xml // layout for small screen size
3res/layout-large/my_layout.xml // layout for large screen size
4res/layout-xlarge/my_layout.xml // layout for extra large screen size
5res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

So habe dann in der Auflösung-Zoll 4,7/4,8 den Bildschirm voll gepackt wie es nur geht mit ImageButton (kleine) zum Testen. Z.B eben wie bei Memory das Spiel.
Gucke ich mir das dann im layout-small an was dann ca 2,7zoll ist, ist die hälfte einfach nicht mehr auf dem Bildschirm.
Und das meine ich. Er packt es einfach nicht zusammen und schrumpft die ImageButton nicht selbs für die richtige Auflösung/Zoll.

@ManuMaticx: Mit GridView beschäftige ich mich schon seit Tagen. Es ist eigentlich echt klasse wenn man weiß wie :).
Nur ist zu viel auf dem Bildschirm dann schmeißt er das nicht raus oder man sich es nicht mehr, sondern man kann runter scrollen auf dem Bildschirm. Und das z.B bei dem Spiel Memory ist nicht so toll :).

Edit: Naja gut man kann aufjedenfall irgendwie jede layout.xml in jeden layout Ordner anders machen. Mal gehts und mal gehts nicht. Wenn das alles hinterher klappt dann ist das ja kein problem für jede Auflösung/Zoll.


LG

— geändert am 02.07.2012, 03:04:46

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

02.07.2012, 08:46:31 via Website

@Michele: Ich vermute Dir fehlen in diesem Zusammenhang noch ein paar Infos. Ich versuche sie mal stichwortartig zusammenzufassen:

* Normalerweise reicht ein Layout/Drawable für alle Auflösungen wenn Du mit den Anpassungen die das System dann automatisch vornimmt zufrieden bist. Die Ordner layout/drawable bleiben dann die einzigen ihrer Art.

* Gefällt Dir die Darstellung eines Layouts oder eines Drawables für eine bestimmte Größe nicht dann legst Du für genau diese Größe den weiteren, speziellen Ordner an (z.B. layout-land für ein Landscape-Layout oder drawable-xhdpi für ein Tablet-Image). Du musst nicht alle Spezial Ordner anlegen - nur die in denen auch angepasste Drawables/Layouts vorkommen.

* In diesem speziellen Ordner müssen dann nicht alle Dateien des Urprungsordners (layout/drawable) vorkommen. Nur die Layouts/Drawables die Du geändert wissen willst legst Du da hinein. Die Dateien erhalten dabei den selben Namen wie die Ursprungsdateien in den Ursprungsordnern. Der Inhalt sollte sich aber schon unterscheiden.

* In Deinen Programmen musst Du dazu keine Änderungen vornehmen denn das System sucht sich selbst die passenden Dateien zusammen.


Ich bin jetzt nicht der Design-Kenner. Wenn ich ein Schwein malen soll kommt dabei eine Kiste raus. Deshalb nur ein simples Beispiel:

In zwei meiner Apps gibt es eine WebView mit einer horizontalen Auswahl Gallery darüber. Hierfür würde normalerweise ein einzelnes Layout reichen. Ich war aber mit der von Android automatisch vorgenommenen Skalierung nicht zufrieden. Deshalb habe ich nur für dieses eine Layout den layout-land Ordner angelegt und eine modifizierte Version der Datei dahinein gelegt.

Datei: anzeige.xml im Ordner layout:

1<LinearLayout
2 xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_height="fill_parent"
4 android:layout_width="fill_parent"
5 android:orientation="vertical" >
6
7 <Gallery
8 android:id="@+id/gallery"
9 android:layout_height="0dip"
10 android:layout_weight="1"
11 android:layout_width="fill_parent"
12 android:spacing="2dip" />
13
14 <View
15 android:background="@android:color/white"
16 android:layout_height="1dip"
17 android:layout_marginTop="2dip"
18 android:layout_width="fill_parent" />
19
20 <WebView
21 android:id="@+id/webview"
22 android:layout_height="0dip"
23 android:layout_marginTop="2dip"
24 android:layout_weight="6"
25 android:layout_width="fill_parent" />
26</LinearLayout>

Datei: anzeige.xml im Ordner layout-land:

1<LinearLayout
2 xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_height="fill_parent"
4 android:layout_width="fill_parent"
5 android:orientation="vertical" >
6
7 <Gallery
8 android:id="@+id/gallery"
9 android:layout_height="0dip"
10 android:layout_weight="1"
11 android:layout_width="fill_parent"
12 android:spacing="2dip" />
13
14 <View
15 android:background="@android:color/white"
16 android:layout_height="1dip"
17 android:layout_marginTop="2dip"
18 android:layout_width="fill_parent" />
19
20 <WebView
21 android:id="@+id/webview"
22 android:layout_height="0dip"
23 android:layout_marginTop="2dip"
24 android:layout_weight="4"
25 android:layout_width="fill_parent" />
26</LinearLayout>


Wie Du sehen kannst sind das nur minimale Anpassungen. Durch den layout_weight in der vertikalen Ausrichtung passe ich die Größe der Gallery minimal an.

Um das mal auf Deinen konkreten Fall anzuwenden würde ich, wie hier schon vorgeschlagen wurde, auf LinearLayout wechseln und mit layout_weight die Gewichtung der Buttons untereinander festlegen. Gib zum Beispiel jedem Button in einer horizontalen Reihe mal den linear_layout="1", lass in dem Fall mal Größenangaben wie dip weg.

— geändert am 02.07.2012, 08:49:48

Antworten
Michele
  • Forum-Beiträge: 1.525

03.07.2012, 04:25:25 via Website

Hallo.

Danke dir nochmal Harald. :)
Ich denke nun habe ich es soweit nochmal besser verstanden. :)
Bekomme das nun hoffentlich hin. Werde es nun mal genauer testen durch deine Tipps und Hilfe.




LG

Antworten