Layout: statische statt relativer Werte

  • 69 Antworten
  • Neuester Beitrag
Diskutiere Layout: statische statt relativer Werte im Android App Entwicklung im Bereich Betriebssysteme & Apps.
K

Knoxxx

Fortgeschrittenes Mitglied
Hallo,

ich hätte gern folgenden Code in statischen Werten. Aber ich weiß nicht wie das funktioniert. Momentan arbeite ich noch mit relativen Werten (left=60dp etc)...

verrutscht6.png

Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/Button02"
        android:layout_width="150dp"
        android:layout_height="75dp"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_alignParentRight="true"
        android:layout_marginRight="60dp"
        android:text="Button" />

    <Button
        android:id="@+id/button1"
        android:layout_width="150dp"
        android:layout_height="75dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="60dp"
        android:layout_marginTop="69dp"
        android:text="Button" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/pfeilrechts" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:src="@drawable/pfeillinks" />

</RelativeLayout>
 
Jaiel

Jaiel

Experte
Wieso möchtest du mit statischen Werte arbeiten?
Wie dem auch sei benutzt einfach px
 
Kardroid

Kardroid

Stammgast
Hallo Knoxxx,

ich würde dir auch eher abraten statische Pixel zu nehmen.
Vielleicht kannst du hier ja mal beschreiben, warum du es machen möchtest. Dann kann man gemeinsam diskutieren, ob es Sinn macht, oder nicht.
 
K

Knoxxx

Fortgeschrittenes Mitglied
Weil das gepostete Layout bei einem 3,2" Gerät bspw gut aussieht. Aber wenn ich den gleichen Code für ein 3,3" Gerät benutze rücken die Buttons etwas nach links und alles sieht assymetrisch aus. Ich dachte, das liegt daran, dass ich relative Werte nutze?
 
Kardroid

Kardroid

Stammgast
Also ich habe jetzt deinen Code importiert und konnte kein Problem finden, bei mir hat es immer den gleichen Abstand vom Rand.
Ich habe das AlignBaselign mal mit einem top ausgetauscht. Vielleicht kannst du das testen.

Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/Button02"
        android:layout_width="150dp"
        android:layout_height="75dp"
        android:layout_alignParentRight="true"
        android:layout_marginRight="60dp"
        android:layout_marginTop="69dp"
        android:text="Button" />

    <Button
        android:id="@+id/button1"
        android:layout_width="150dp"
        android:layout_height="75dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="60dp"
        android:layout_marginTop="69dp"
        android:text="Button" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/abc_btn_check_material" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:src="@drawable/abc_btn_check_material" />

</RelativeLayout>
 
K

Knoxxx

Fortgeschrittenes Mitglied
Der Abstand zum Rand bleibt gleich, das stimmt. Aber der Abstand zur vertikalen Mittellinie wird mit steigender Zoll-Größe größer. Die Buttons und Pfeile rücken also mehr und mehr nach außen, was irgendwann nicht mehr gut aussieht. Bei 3,2" und 3,3" geht es noch. Ab 3,4" sieht es schon komisch aus. Ich will also, dass die Buttons und Pfeile proportional gesehen den gleichen Abstand zum Rand und zur vertikalen Mittellinie haben...
 
Jaiel

Jaiel

Experte
Weil die dp Units nun mal quantisiert sind das heißt es gibt keinen laufenden Übergang, keine Zwischenwerte. Ab einer bestimmten Größe(ich schätze ab 4") springt er wohl auf die neue dp einheit und stellt es wiederum richtig dar.
 
Jaiel

Jaiel

Experte
Du könntest aber zur Laufzeit in onCreate die Größe des Displays ermitteln und dort die Angaben dann über LAyouparams den jeweiligen Views(imageview, button) zuweisen mit setMargins()
 
Jaiel

Jaiel

Experte
 
Kardroid

Kardroid

Stammgast
Ich habe es immer noch nicht ganz verstanden, was du machen möchtest, aber ich glaube weightSum und layout_weight sind hier richtig.

Ich habe mal dein Beispiel darauf hin verändert.
Wenn du jetzt die unteren Image Views anders positionieren willst, dann kannst du sie in den 50% des Bildschirms positionieren.

Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="69dp"
        android:weightSum="2">

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

            <Button
                android:id="@+id/button1"
                android:layout_width="150dp"
                android:layout_height="75dp"
                android:layout_centerHorizontal="true"
                android:text="Button" />

        </RelativeLayout>

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

            <Button
                android:id="@+id/Button02"
                android:layout_width="150dp"
                android:layout_height="75dp"
                android:layout_centerHorizontal="true"
                android:text="Button" />

        </RelativeLayout>


    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:weightSum="2">

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

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

        </RelativeLayout>


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


            <ImageView
                android:id="@+id/imageView2"
                android:layout_width="150dp"
                android:layout_height="100dp"
                android:layout_centerHorizontal="true"
                android:src="@drawable/abc_btn_check_material" />

        </RelativeLayout>

    </LinearLayout>


</RelativeLayout>
 
missspelled

missspelled

App-Anbieter (In-App)
Jaiel schrieb:
Du könntest aber zur Laufzeit in onCreate die Größe des Displays ermitteln und dort die Angaben dann über LAyouparams den jeweiligen Views(imageview, button) zuweisen mit setMargins()
Das würde ich nur dann machen, wenn es sonst keine andere Möglichkeit gibt. Macht nämlich unter umständen ziemlich viel Arbeit...
 
Jaiel

Jaiel

Experte
Ja wenn man sich die Mühe machen möchte. Ich würde einfach eine Methode schreiben wo man über einfache Schnittstellen die gewünschten Positionen in Prozent angibt plus die dazugehörige view . Dann wäre die sache gegessen.
 
Kardroid

Kardroid

Stammgast
Für prozentuale Werte sind die LinearLayouts mit WeightSum von Google erstellt worden. Und nach MVC dort auch auf jedenfall besser aufgehoben.
Ok, man könnte eine eigene CustomView dafür bauen und wir wären wieder bei MVC, aber warum bauen, wenn es schon WeightSum und layout_weight gibt?
 
K

Knoxxx

Fortgeschrittenes Mitglied
Vielen Dank für die Antworten!
@Kardroid: Der Code läuft gut...Meine Absicht war es anstatt der Buttons zwei Bilder zu haben (eine Art Fotoalbum). Wenn ich die Buttons durch Bilder ersetze (durch den gleichen Code), rutschen die Bilder aber etwas zu weit nach unten. Wie bekomme ich die denn höher ohne dp-Werte?
Fotoalbum.png
 
Kardroid

Kardroid

Stammgast
Hallo Knoxxx,

ich verstehe deine Frage nicht so ganz.
Meinst du, dass das rechte Bild ein wenig tiefer ist, als das linke? Oder meinst du die paar Pixel beim linken Bild, wo man noch den Button oben im Hintergrund sehen kann?
 
K

Knoxxx

Fortgeschrittenes Mitglied
ach so nee, ich meine, dass beide Bilder etwas zu tief liegen. Also zu nah an den Pfeilen. Sie müssten beide etwas nach oben gerückt werden, so dass sie zwischen dem oberen Bildschirmrand und den Pfeilen liegen. Mit den Buttons hat das nichts zu tun. Die lösche ich noch, habe ich noch nicht gemacht.
 
Kardroid

Kardroid

Stammgast
Hi,

das könnte auch über WeightSum gelöst werden, aber warum solltest du das nicht die dp in android:layout_marginTop="69dp" vom ersten LinearLayout kleiner machen können?
 
K

Knoxxx

Fortgeschrittenes Mitglied
Ja stimmt, das klappt. Ich dachte man arbeitet nicht mit relativen Werten, wenn das Layout für verschiedene Zollgrößen passen soll. Aber es klappt ja doch. Super. Eine Frage hätte ich aber noch. Den Abstand der Bilder zum äußeren Rand kann man ja innerhalb des LinearLayout über android:layout_width verändern. Allerdings verändert das (sowie auch die Funktion MarginLeft/Right) immer die Position beider Bilder. Ich möchte jetzt aber, dass nur das rechte Bild ein wenig mehr in die Mitte rückt und das linke Bild bleibt wo es ist. Geht das auch?
 
Zuletzt bearbeitet:
Jaiel

Jaiel

Experte
Ich glaube die Antwort ist wieder uber die Weigthsum. Sagen wir mal das rechte soll etwas näher an der Mitte sein sagen wir 40% vom rechten Rand und das linke 25% vom Linken Rand dann würde ich jeden Bild die reziproke Weightsum der anderen in Prozent angegeben Posiiton geben:

rechtes Bild= 1/0.25=4 und
linkes Bild=1/0.4=2.5

Ich hoffe es ist richtig so!
 
K

Knoxxx

Fortgeschrittenes Mitglied
Ich habe jetzt mal diesen Code für ein 3,2" 3,3" und 3,4" - Gerät benutzt. Und nun ist es so, dass mit steigender Zollgröße die Bilder (Rosen) sich mehr und mehr vom Rand entfernen.. Es ist also so, dass die Bilder mit steigender Displaygröße nach innen rücken und die Pfeile weiter nach außen...da entsteht also auch wieder eine Asymmetrie mit steigender ZollGröße. Ich wollte ja eigtl, dass die App auf allen Bildschirmen gleich proportional aussieht...
 
Ähnliche Themen - Layout: statische statt relativer Werte Antworten Datum
4