Layout Anpassung für alle Devices?

  • Antworten:8
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 7

20.06.2017, 08:22:45 via Website

Hallo zusammen,

ich arbeite gerade noch an meiner ersten App. Bisher steht eigentlich alles, ich habe das Layout jedoch die ganze Zeit nach dem Nexus 6 ausgerichtet. Dort sieht dann natürlich alles wunderschön aus. Problem ist, wenn ich ein Nexus 5 o.Ä. verwende: das Bild nimmt dann so viel Platz ein (fixe Höhe), dass der ImageButton überhaupt nicht mehr angezeigt wird.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="...keine Links..."
android:orientation="vertical"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/image_count"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="Here we count..."
    android:textColor="@android:color/black"
    android:textSize="16sp" />

<ImageView
    android:id="@+id/swipe_image"
    android:layout_width="match_parent"
    android:layout_height="365dp"
    android:layout_marginBottom="20dp"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:layout_marginTop="30dp"
    android:adjustViewBounds="false"
    android:onClick="onClickImage" />

<ImageButton
    android:id="@+id/favourite_button"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:layout_gravity="center"
    android:background="@android:color/transparent"
    android:scaleType="fitCenter"
    android:src="@drawable/heart"
    android:onClick="onClickFav" />

Welche Möglichkeiten habe ich, dass das Image z.B. nur 50% des gesamten Bildschirms einnimmt? Wenn ich es bei dem Layout hinbekommen würde, könnte ich es dann auch bei den anderen Layouts umgestalten...

Danke für euren Rat! (cool)

— geändert am 20.06.2017, 08:23:33

Antworten
  • Forum-Beiträge: 2.902

20.06.2017, 08:33:53 via Website

Hallo L,

die gängigste Art ist , dies in ein ScrollView einzubetten - da du ja vertical anpassen möchtest.
Desweiteren solltest du für deine Elemente im vertikalen LinearLayout deine Weights setzen.

Allgemein sollte man allerdings verschiedene Layouts verwenden
https://developer.android.com/guide/practices/screens_support.html

Und dann bleibt dir noch übrig, zur Laufzeit die Abmasse des Images zu ermitteln und das ImageView
proportional anzupassen

— geändert am 20.06.2017, 09:17:00

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 7

20.06.2017, 09:24:53 via Website

Wenn ich jetzt also folgende Layouts anlegen würde...

res/layout/my_layout.xml
res/layout-small/my_layout.xml
res/layout-large/my_layout.xml
res/layout-xlarge/my_layout.xml
res/layout-xlarge-land/my_layout.xml

Kann man irgendwo nachlesen welche Geräte jetzt beispielsweise layout-large entsprechen?
Hab dazu nichts gefunden.

Antworten
  • Forum-Beiträge: 2.902

20.06.2017, 09:30:02 via Website

Dazu wirst auch nichts aussagekräftiges finden , denn es ist immer eine Abhängigkeit
des verbauten Displays und besonders auf deren verbauten DPI

Also Grösse in Abhängigkeit der DPI - Das wäre eine schier explodierende Liste :-)

Wenn du das Testen möchtest , stehen dir im LayoutEditor jede Menge Möglichkeiten zur Verfügung
und darüber hinaus kannst du dir die verschiedenen Emulatoren anlegen.

Ich habe dazu mir allerdings eine eigene Bibliothek geschrieben , die Grösse des Displays ermittelt und
proportional zur DPI die Elemente zur Laufzeit berechnet - ich arbeite nur im Notfall mit verschiedenen Layouts

— geändert am 20.06.2017, 09:49:06

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 7

20.06.2017, 09:51:00 via Website

Verstehe. Habe jetzt mal versuchsweise ein neues directory "layout-large" angelegt. Nexus 3.7 - Nexus 6 gehören allerdings alle zum normalen Layout wie ich feststellen musste. Erst ab Nexus 7 beginnts mit large. Ein ScrollView ist eigentlich keine Option für diesen Zweck...

Steht deine Bibliothek zur freien Verfügung und falls ja: wie genau funktioniert die Einbindung?

Viele Grüße

Antworten
  • Forum-Beiträge: 2.902

20.06.2017, 10:04:32 via Website

Ich publiziere keinen offenen Quellcode - der Aufwand raubt mir die Zeit , da ich meine Brötchen
damit verdiene :-)

Grundsätzlich kannst du in der einfachen Variante erst mal ermitteln , wie gross dein Display ist.
Damit kannst du schön händisch zur Laufzeit die Wahl des Layouts setzen

Hier mal einfach ein schlichtes Copy & Paste aus meinem Quellcode der
dir als Anhaltspunkt dienen soll.

float xInches,yInches;
Point size = new Point();
DisplayMetrics metrics = new DisplayMetrics();
WindowManager wm = (WindowManager) mContext.getSystemService(WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
wm.getDefaultDisplay().getRealSize(size);
yInches = metrics.heightPixels / metrics.ydpi;
xInches = metrics.widthPixels / metrics.xdpi;
LAYOUT_METRICS_X = metrics.xdpi;
LAYOUT_METRICS_Y = metrics.ydpi;
LAYOUT_HEIGHT = size.y;
LAYOUT_WIDTH = size.x;
LAYOUT_INCH = (float) Math.sqrt(xInches * xInches + yInches * yInches);
LAYOUT_HEIGHT_MM = (int) pixel2mm(LAYOUT_HEIGHT);
LAYOUT_WIDTH_MM = (int) pixel2mm(LAYOUT_WIDTH);
if ( LAYOUT_INCH > 6.5) LAYOUT_IS_TABLET = true;

Helferleins :

public int mm2pixel (float mm)
{
double inch_per_mm = 1.0F / 25.4F;
double inch_result = mm * inch_per_mm;
double pixel = LAYOUT_METRICS_X * inch_result;
return (int) pixel;
}

.

public int dpToPx(int dp)
{
Resources r = mActivity.getResources();
return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()));
}

.

public double pixel2mm (int pixel)
{
double pixel_p_mm = 25.4F / (double) LAYOUT_METRICS_X;
return (double) pixel_p_mm * (double) pixel;
}

— geändert am 20.06.2017, 10:19:07

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

20.06.2017, 16:47:35 via Website

Man muss es doch garnicht so kompliziert machen.
Wenn man ein Relative/Linear Layout nimmt und alle Abstände in dp/dip macht, und das Bild dann entsprechend kleiner rechnet dürfte das auch gehen.
Also ich hatte damit noch keine Probleme, und Geräte mit einer Displaygröße >4,5Zoll gibt es kaum mehr.
Wenn man es darauf auslegt und angibt, dass es entsprechend hochskaliert werden soll, ist das kein Problem.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 2.902

20.06.2017, 16:49:52 via Website

@Pascal

Deshalb habe ich auch oben geschrieben , er soll mal ggf weights setzen .

Aber haste das hier in seinem Layout gesehen ?

android:layout_height="365dp"

Ein bissl viel :-)

— geändert am 20.06.2017, 16:50:08

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

20.06.2017, 16:52:02 via Website

Das stimmt, und wenn ich ein Bild einbinde, dann eigentlich immer nur Höhe oder Breite angeben, denn der Rest kommt ja aus dem Seitenverhältnis von selber ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten

Empfohlene Artikel