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. :) :)

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>

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>

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));

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>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.