Legen Sie die Position / Größe des UI-Elements als Prozentsatz der Bildschirmgröße fest

73

Ich versuche herauszufinden, ob es möglich ist, beim Erstellen eines Layouts prozentuale Positionen / Größen zu verwenden. Was ich will ist so etwas ...

^
|
|
| 68%
|
|
v
Gallery (height equivalent of 16% total screen size)
^
| 16%
v

Ich teste auf einem Gerät, das im Querformat eine Anzeige von 800 x 480 tatsächlichen Pixeln hat, und erzwinge es derzeit mit den folgenden ...

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" > 
    <Gallery 
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="80px"
        android:layout_marginTop ="320px"
    />
</RelativeLayout>

Natürlich möchte ich keine festen pxEinheiten fest codieren , aber ich kann 68%oder 0.68für layout_marginTop(zum Beispiel) nicht verwenden . Ich habe mir dpEinheiten angesehen, bin mir aber nicht sicher, ob ich das auch so machen kann.

Ich muss zugeben, dass das UI-Design eine Schwachstelle von mir ist, daher wäre jeder Rat dankbar.

BEARBEITEN: Als zukünftige Referenz, wenn jemand nach einer ähnlichen Antwort sucht, habe ich nach Alan Moores Vorschlag die folgenden genau so, wie ich es will ...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="@drawable/bground"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="0.68"
        android:background="@android:color/transparent"
    />
    <Gallery 
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.16"
    />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="0.16" 
        android:background="@android:color/transparent"
    />
</LinearLayout>

Ich fand einige andere Beispiele für die Verwendung layout_weightund entschied mich , die TextViewHöhen einzustellen 0dpund auch Schwimmer für die Gewichte zu verwenden. Arbeitet großartig. :) :)

Squonk
quelle

Antworten:

70

Ich denke, was Sie wollen, ist das Android zu setzen: layout_weight,

http://developer.android.com/resources/tutorials/views/hello-linearlayout.html

so etwas (ich setze nur Textansichten oben und unten als Platzhalter):

  <LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:weightSum="1">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="68"/>
    <Gallery 
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="0dp"

        android:layout_weight="16"
    />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="16"/>

  </LinearLayout>
Alan Moore
quelle
Ich werde es versuchen - ich müsste die TextView-Elemente jedoch transparent machen, da sie ein Hintergrundbild haben (ich habe leider vergessen, das zu erwähnen). Es sollte aber machbar sein, danke.
Squonk
@AlanMoore Das funktioniert auch bei mir, aber wie würde ich es machen, wenn ich sowohl Größe als auch Gewicht als Breite definieren möchte?
Thev
Hallo @TheveshTheva - wenn ich Sie richtig verstehe, möchten Sie es als horizontale Ausrichtung einrichten und dann die layout_width eher wie "wrap_content" gestalten.
Alan Moore
1
Gute Antwort, aber beachten Sie, dass Sie eine der TextViews entfernen können, wenn Sie android: layout_weight = "1" für das LinearLayout durch android: weightSum = "100" ersetzen und die Höhe aller untergeordneten Elemente auf 0dp setzen. Dies liegt daran, dass das Festlegen von android: layout_weight im LinearLayout in diesem Fall irrelevant ist. Wenn Sie android: weightSum des LinearLayout einstellen, bleibt das gesamte nicht verwendete Gewicht leer (genau wie beabsichtigt).
Jacob R
@ JacobR, toller Punkt! Ich habe weightSum noch nie benutzt, werde das aber auf jeden Fall berücksichtigen.
Alan Moore
18

Verwenden Sie das PercentRelativeLayout oder PercentFrameLayout aus der Percent Supoort Library

<android.support.percent.PercentFrameLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
     <TextView
          android:layout_width="match_parent"
          app:layout_heightPercent="68%"/>
     <Gallery 
          android:id="@+id/gallery"
          android:layout_width="match_parent"
          app:layout_heightPercent="16%"/>
     <TextView
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:layout_width="match_parent"/>
</android.support.percent.PercentFrameLayout>
rahulrv
quelle
2
HEILIGER MIST, das ist FANTASTISCH. Warum haben sie so lange gebraucht, um dies hinzuzufügen? Vielen Dank! Du hast gerade meinen Tag gemacht. :)
Kenny Wyland
1
Etwas durcheinander Sie benötigen ein benutzerdefiniertes Layout, um dies zu tun, wo es in den eingebauten Layouts verfügbar sein sollte ...
Richard Lalancette
Hinzufügen von 68% und 16% zur Dimensionsdatei.
Tushar Pandey
7
Beide Layouts wurden seitdem in Android API Level 26.1.0
Dan
17

Für TextView und seine Nachkommen (z. B. Button) können Sie die Anzeigegröße vom WindowManager abrufen und dann die TextView-Höhe auf einen Bruchteil davon einstellen:

Button btn = new Button (this);
android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
btn.setHeight((int)(display.getHeight()*0.68));
joseph_morris
quelle
7

Das obige Problem kann auch mithilfe von ConstraintLayout über Richtlinien gelöst werden .

Unten ist das Snippet.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.constraint.Guideline
    android:id="@+id/upperGuideLine"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.68" />

<Gallery
    android:id="@+id/gallery"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@+id/lowerGuideLine"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/upperGuideLine" />

<android.support.constraint.Guideline
    android:id="@+id/lowerGuideLine"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.84" />

</android.support.constraint.ConstraintLayout>
Ujwal Agrawal
quelle
1

Schau dir das an:

http://developer.android.com/reference/android/util/DisplayMetrics.html

Sie können die Höhe des Bildschirms ermitteln und es ist einfach zu berechnen, 68 Prozent des Bildschirms zu berechnen.

Finn Larsen
quelle
Danke, ich habe mich gefragt, ob ich es eher im Code als in der Layout-XML tun müsste.
Squonk
1
Nicht erforderlich und in XML mit Gewicht machbar.
RichieHH