Layout: statische statt relativer Werte

Wie gesagt sind die dp quantisiert da bleibt zum Beispiel 1 dp gleich 1,5 px über mehrere Größen hinweg. Und man könnte es wie gesagt dadurch lösen dass man die Positionen in Prozent vom Wdith und HEight des Screen abhängig macht. Ich bin kein xml profi und wieß nciht wie man dass in xml lösen könnte aber in Code stehen dir vielfältige Möglichkeiten bereit. Dann würdest du die Positionen in px angeben aber trotzdem relativ rechnen
 
Wenn man die Bilder horizontal und vertikal zentriert, dann bleiben sie auch immer an der Stelle, also dem Zentrum, und es sieht auf allen Geräten gut aus. Und das einzustellen ist ja ganz einfach. Ich dachte, es ist genauso einfach, das Bild horizontal zentriert zu lassen, aber vertikal etwas nach links zu verschieben. Aber ist es wohl nicht. Meinst du ich soll einfach die dp in px umwandeln?
 
Ja nein!

Du hast zum Beispiel mit Hilfe des Windowmanager herausgefunden dass das gerät 720x1280 px groß ist. So jetzt möchtest du horizontal zentrieren dann legst du den Mittel punkt auf 50% fest und vertikal möchtest du es etwas mehr nach links weg vond er Mitte sagen wir mal auf 20% dann ist horizontal die position 50%*720px=360px und vertikal 20%*1280=256px und das setzt du dann auch als position(oder du holst dir die größenangaben der View und berechnest darüber die Margin)

Wie gesagt in Code ist das aber viel Arbeit aber hat man einmal ein paar Methoden geschrieben die das xml ersetzen ist es nur ncoh eine reine copy paste angelegenheit(wenn man die mehtoden udn die schnittstellen wiederverwendbar anlegt)
 
ok, ich hätte gedacht, dass es einen einfachen Befehl dafür gibt... Denn wenn ich ein Bild im Zentrum haben will gehe ich einfach auf "Center Vertically" und "Center Horizontally". Und dann ist und bleibt das Bild auch genau in der Mitte. Und jetzt will ich, dass das Bild etwas weiter nach links verschoben wird, also ins Zentrum der ersten Hälfte der Seite. In anderen Worten: wenn ich mein relative layout in zwei gleich große Hälften teile, dann möchte ich das Bild im Zentrum der linken Hälfte haben...gibt's dafür keinen Befehl?

So ungefähr soll es aussehen:
verrutscht2.png
 
Hi,

es gibt zwar keinen direkten Befehl, aber du kannst es genauso machen wie schon am Anfang gezeigt.
Du teilst die Breite in zwei Bereiche, die immer 50% sind. Im rechten Bereich kann ein Platzhalter hin, und im Linken dann dein Bild.

Ich habe gerade einen kleinen Fehler in meinem ersten Code gefunden.
Wenn man WeightSum benutzt, müssen die Breiten in dem entsprechenden Layout layout_width:0dp haben.

Hier nochmal ein Beispiel:
Code:
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="69dp"
        android:weightSum="2">

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">

            <ImageView
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:src="@drawable/abc_btn_radio_to_on_mtrl_015" />

        </RelativeLayout>

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">

           

        </RelativeLayout>


    </LinearLayout>
 
Danke. Ich habe mal ein LinearLayout in drei Teile gesplittet. Aber iwie bin ich zu blöd die Rose in der rechten Hälfte zu zentrieren. Was mache ich falsch?
verrutscht2.png
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_weight="0.8"
android:orientation="horizontal"
android:weightSum="1">

<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5"
android:orientation="vertical">

</LinearLayout>

<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5"
android:orientation="vertical" >

<ImageView
android:id="@+id/imageView1"
android:layout_width="150dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:src="@drawable/rosezwei" />

</LinearLayout>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.2"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>
 
Zuletzt bearbeitet:
Vertical oder horizontal zentrieren?
Horizontal ist sie doch schon zentriert.

Um das Bild vertical zu zentrieren würde ich noch ein RelativeLayout hinmachen:
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_gravity="center_horizontal"
        android:layout_weight="0.8"
        android:orientation="horizontal"
        android:weightSum="1">

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5"
            android:orientation="vertical">

        </LinearLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5"
            android:orientation="vertical" >

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">
           
            <ImageView
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:id="@+id/imageView1"
                android:layout_width="150dp"
                android:layout_height="100dp"
                android:src="@drawable/abc_btn_radio_to_on_mtrl_015" />

            </RelativeLayout>
           
        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.2"
        android:orientation="vertical">
    </LinearLayout>
</LinearLayout>

Erst ab einer Tiefe von 10 braucht man sich um Verschachtelung sorgen zu machen. Wir haben ein paar Apps im Store, die schon ziemlich viele Ebenen an Verschachtelung haben, aber es gibt keine Beschwerden oder Performanceeinbuchen.
 
ok danke!!! Wie macht ihr das eigtl, dass euer Code unterschiedliche Zollgrößen unterstützt? Ich habe für jede Zollgröße bei Eclipse ein extra Layout geschaffen. Also für 2,7" bspw habe ich das Layout layout-320x240 geschaffen. Das klappte auch gut bis zum 5,1" Gerät. Denn 5,1" ist mit 480x800 identisch mit 3,7". Wenn ich also im Layout von 3,7" etwas ändere, hat das blöderweise auch Auswirkungen auf 5,1". Wie kann ich denn für 5,1" ein extra Layout erstellen?
 
Hallo Knoxxx,

das ist nicht die Best Practice.
Diese Seite musst du dafür verinnerliche haben: Supporting Multiple Screens | Android Developers

Ab welcher Android Version willst du denn unterstützen?
Wir machen bei B2B und B2C zurzeit nur noch ab 4.0.3.

Wenn du dir die Viewports von fast allen Android Handhelds (nicht Tablets) anschaust, dann siehst du in der Breite 320dp und 360dp.
Bei der Höhe gibt es eigentlich nur long und not-long also sowas wie der Unterschied zwischen Iphone 3 und Iphone 5.

Probleme gibt es eigentlich nur bei Text, der nicht umgebrochen werden darf. Text soll immer mit SP angegeben werden.
Hier mal unsere Ordnerstruktur bei einer App, die online ist.

bildschirmfoto-2015-06-20-um-18-29-01-png.406338

Wir brauchten die Unterscheidung zwischen 320dp und 360dp, weil ein paar Texte anders dargestellt werden mussten, und mit values-sw360dp konnte in der strings.xml angeben werden, wie der Text für ab 360dp aussieht.
"sw" steht hier für "smallest width" also alle Smartphones mit einer größeren Breite als 360dp werden die Layouts und Texte sehen, welche für sie erstellt wurden.
Sie sehen aber auch die "Default"-Layouts, falls keine in sw360dp angelegt wurden.
Unser Code ist nicht an allen Stellen gut wartbar, da wir nicht immer mit Includes etc. gearbeitet haben, aber deine Ordnerstruktur stelle ich mir noch viel Schlimmer vor.

Ich würde an deiner Stelle genau an diesem Punkt refactorn und dir nehmen, um die Layout Ordnerstruktur zu verstehen und es dann richtig machen.
Das spart sicher sehr viel Zeit später bei größeren Änderungen.
 

Anhänge

  • Bildschirmfoto 2015-06-20 um 18.29.01.png
    Bildschirmfoto 2015-06-20 um 18.29.01.png
    9,4 KB · Aufrufe: 300
Knoxxx schrieb:
ok danke!!! Wie macht ihr das eigtl, dass euer Code unterschiedliche Zollgrößen unterstützt? Ich habe für jede Zollgröße bei Eclipse ein extra Layout geschaffen. Also für 2,7" bspw habe ich das Layout layout-320x240 geschaffen. Das klappte auch gut bis zum 5,1" Gerät. Denn 5,1" ist mit 480x800 identisch mit 3,7". Wenn ich also im Layout von 3,7" etwas ändere, hat das blöderweise auch Auswirkungen auf 5,1". Wie kann ich denn für 5,1" ein extra Layout erstellen?
Ich mach das im Code.
Dafür greife ich aber nicht auf die Standard view von Android zurück sondern implementiere meine eigenen Objekte mit Positionen Größen etc. pp.
Ich finde es so in Ordnung da es mir Spaß macht in Code zu arbeiten und weniger ein Script zu verwenden. Dafür stimmen auf jedem Gerät die Proportionen da ich anhand der Pixel dichte die ganzen Attribute setze.
Diese sind auch nicht so ausgefallene Klassen die einem Observer Pattern unterliegen sowie die View Klassen sondern immer individuell zugeschnitten zum Projekt. Du könntest dir ja ein Framework schreiben um deine Views in Code zu initialisieren. Ich finde es irgendwie blöd dass man die Attribute in Android nicht in Prozent angeben kann.

Dieses Problem mit den dp die du hast ist dann blöd für den Entwickler und da scheint es keine befriedigende Lösung in XML zu geben.

Wie gesagt der Weg über Code steht dir weiterhin offen. Bei dir sind es ja nur die Margins die gesetzt werden müssen also ein Versuch ist es Wert mMn.
 
Hallo Jaiel,

da ich fast alle deine Posts, seit deinem Eintreffen hier im Forum kenne, weiß ich, dass du aus der Spieleprogrammierung kommst.
Ich habe auch schon zwei Spiele programmiert, und weiß daher, dass dort mit Prozenten viel einfacher zu programmieren ist. Mein Code ist da aber nicht mehr so wartbar wie meine Android Projekte.

Da du bei fast jedem neuen Thread, in dem es um Positionierung geht, hier deine Code-Methode anpreist, fühle ich mich schon fast gezwungen jedes Mal zu antworten, dass die Google Methode über XML-Dateien auch gut ist, und für die Wartbarkeit/Pflege und Weitergabe des Codes sogar besser ist.

Ich finde, du könntest deine selber geschrieben Methoden in ein Open-Source-Framework auslagern und diese so umschreiben, dass sie mittels CustomViews auch in einer XML benutzt werden können.

Ich stelle mir da sowas vor:
Du erstellst deine eigene LayoutKlasse. (JaielLayout erbt von RelativeLayout)
Dort kann man wieder weitere JaielLayouts einfügen oder Views.
Mit eigenen Parametern jaiel_width, jaiel_height und jaiel_margins, kann man die Werte im XML definieren, und über deine Logik werden sie dann beim Kompilieren in die App gepackt.
So könntest du deine Art auch anderen zur Verfügung stellen und ggf. könnte es so groß werden, dass sehr viele es benutzen würden.

Denk mal darüber nach.
 
Ist schon eig besser es in xml zu machen. Es wäre bestimmt ein schöner anreiz mal ein open sopurce framework zu amchen. Zur Zeit habe ich zwar zu viel zu tun aber das wäre ein tolles nebenprojekt wenn cih ehrlich bin. Ich bin etwas verwirrt ob dzu mcih auf den Arm nehmen willst um ehrlich zu sein da du mein Nicknamen so oft benutzt hast :confused2:
 
Nein, war nichts mit auf dem Arm nehmen.
Ich kenne viele OpenSource-Frameworks, die den Nickname des Erstellers in den Parametern der API benutzen.
So kann man sich ein wenig bekannt machen und ggf. dadurch auch neue Projekte aquirieren, wenn Projektleiter so eine Verbindung zu einem finden können.
 
Vielen Dank für eure Antworten!

Kardroid schrieb:
Ab welcher Android Version willst du denn unterstützen?
Wir machen bei B2B und B2C zurzeit nur noch ab 4.0.3.
Ich weiß auch noch nicht genau, ab welcher Version. Kann man nicht einfach auch viel ältere Versionen noch mit reinnehmen?
 
Auch wenn du die SupportLibraries von Android mit rein nimmst, gibt es immer ein paar Stellen, die nicht genauso funktionieren.
Beispielsweise muss man auf 4.0.1 und 4.0.2 die Aufrufe des Backbuttons bei den ActionBarMenüs ganz anders programmieren, als ab 4.0.3.

Und wenn du dir meinen wichtigen Link durchgelesen hättest, hättest du gesehen, dass die sw360dp-Funktion erst mit 3.2 reinkam.
Zitat: Also, be aware that Android 3.2 has introduced new APIs that allow you to more precisely control the layout resources your application uses for different screen sizes.

Ich finde deinen Ansatz auch zu perfektionistisch und nicht wartbar. Mach dich am besten mit den Eigenheiten der Unterstützung für mehrere Screenresolutions vertraut und implementiere dann danach.
So wirst du, meiner Meinung, nach auch viel schneller etwas erstellen können.
 
Kardroid schrieb:
Und wenn du dir meinen wichtigen Link durchgelesen hättest, hättest du gesehen, dass die sw360dp-Funktion erst mit 3.2 reinkam.
Zitat: Also, be aware that Android 3.2 has introduced new APIs that allow you to more precisely control the layout resources your application uses for different screen sizes.
ah ja, ok sorry, hatte das noch nicht gelesen. Ich habe jetzt mal deine Ordnerstruktur übernommen. Das sieht gut aus, nur bei 4,65" und 4,7" wird alles total unproportional und viel zu groß. Bei 4" ist alles in Ordnung, bei 5,1" auch, aber 4,65" und 4,7" machen Stress. Muss ich evtl für die beiden ein extra Layout anlegen?
 
Zuletzt bearbeitet:
Was haben denn deine beiden Geräte für Viewports? Also was ist die dp width und dp height?

Ich habe ein wenig gegooglet und habe nur ein Gerät mit 4,65 Zoll gefunden. Das Galaxy Nexus.
Unter Viewport Sizes konnte ich mir den Viewport anschauen.

360w*598h.
Meine Ordnerstuktur ist eigentlich nur für Portrait gedacht, bis auf einen Screen, der ist in Landscape.
Entwickelst du für Landscape oder Portrait?

Du KANNST nicht für jede Zollgröße entwickeln. Was würde passieren, wenn ein Gerätehersteller auf einmal 4,44564 Zoll Geräte herstellen würde?
 
ok, du meinst, dass die App nicht auf allen Geräten gut aussieht, weil man eben nicht alle Geräte berücksichtigen kann? Das klinkgt einleuchtend...
Eigtl will ich Portrait und Landscape machen, aber momentan bin ich noch bei Portrait...
 
Zuletzt bearbeitet:
Eigentlich kann man solche einfachen Layouts in 90% der Fälle mit einem RelativeLayout abdecken und es sieht gut aus.
Wenn es nicht gut aussieht würde ich an deiner Stelle nochmal auf dem Papier anfangen und das Design selbst anpassen.
Was du momentan tust ist ein absolut unnötiges aufs Pixel rumgeeiere... Das wird nie mit allen Geräten funktionieren...
 
Es gibt mehrere Punkte, wie eine App auch auf jedem Gerät gut aus sieht.
1. Der Designer sollte für Handheld Portrait und Landscape direkt die Screens in Photoshop erstellen. Am besten er kennt sich auch mit der DP- und SP-Thematik aus, so dass seine Designs Responsive gebaut werden können.
Dabei ist zu berücksichtigen, dass normalerweise nur vertikal gescrollt wird, außer es handet sich um einen ViewPager etc.

Ein Beispiel dafür wäre eine Buttonbar, die eine feste Höhe hat und genau 7 Buttons beinhaltet, die eine Höhe von 48dp (nach Guidelines) hat.
Die Buttons hätten damit auch eine Breite von ca. 51DP, bei einem 360DP breiten Smartphone.
Wenn der Designer jetzt nur für 360DP designed hat, und du es auf einem Gerät mit 320DP anzeigen lässt, dann haben die Buttons nur noch 45DP Klickfläche in der Breite.
Wir hatten sogar schon mal das Problem, dass dann Wörter für die Menüeinträge benutzt wurden, die bei einer lesbaren Schriftgröße genau 50DP brauchten.
Entweder man verkleinert die Schrift für 320DP, oder wie bei uns, der Menüeintrag wurde umbenannt. Zweizeilig geht dann einfach nicht.

2. Man benutzt die Android-Ordner, die die meisten Geräte abdecken.
Der Ordner sw360DP wird dann von Android genommen, wenn das Gerät 360dp oder höher hat SW steht ja für Smallest Width.
Alle Geräte mit einer Breite von 0 bis 359 werden dann die LayoutFiels im normalen LayoutOrdner verwenden, und die mit 360 bis unendlich werden dann die LayoutFiles in dem sw360DP-Ordner verwenden.

3. Mit "gut aussieht" meine ich "nicht identisch"
Bei einer anderen App von uns, hat der Designer Texte ausgewählt, die bei 360DP genau 4 Zeilen lang waren bei einer Größe von ca. 12 SP.
12 SP kann man bei LDPI fast nicht mehr lesen, hätten wir bei 320DP auf 10 SP gewechselt, um immer noch 4 Zeilen anzuzeigen, wäre noch schlechter lesbar gewesen. Der Kunde musste dann in den sauren Apfel beißen, und 5 Zeilen anzeigen lassen. Diese zusätzliche Zeile hat aber das Design vertical verändert.

Also man kann so entwickeln, dass es gut aussieht UND sogar noch praktikabel und schnell programmierbar und wartbar ist.
Ich würde dir auch vorschlagen es einmal zu lernen, und dann bei jeder weiteren App anzuwenden.

Der oben genannte Ansatz ist auch nur meine Erfahrung aus ca. 4 Jahren Appentwicklung, falls es in der Zwischenzeit bessere Möglichkeiten gibt, sehe ich sowas immer erst spät und wie bei Fragments finde ich es kompliziert, da ich ganz anders angefangen habe.
Falls du also eine bessere Alternative für das Erstellen von XML-Design-Dateien in Android hat, bin ich nicht abgeneigt etwas noch zu lernen.
 

Ähnliche Themen

5
Antworten
22
Aufrufe
1.421
590239
5
R
  • RalfKahl
Antworten
10
Aufrufe
301
RalfKahl
R
Zurück
Oben Unten