Prozentsatzbreite in einem RelativeLayout

Ich arbeite an einem Formular-Layout für eine Login- Activity in meiner Android-App. Das Bild unten ist, wie ich es aussehen möchte:

Bildbeschreibung hier eingeben

  • Philips Hue Android SDK Prüfung auf Sonnenuntergang /
  • MPAndroidChart versteckt das Hintergrundgitter
  • Warum android auf einer VM (Dalvik) gebaut ist
  • Android - Wie richtig behandeln onPause / onResume Methoden?
  • Aktualisieren auf Android SDK Tools R22
  • Android: Open Spinner von Button
  • Ich konnte dieses Layout mit folgendem XML erreichen . Das Problem ist, es ist ein bisschen hackish. Ich musste eine breite Größe für den Host EditText. Speziell musste ich angeben:

     android:layout_width="172dp" 

    Ich möchte dem Host und dem Port EditText wirklich eine prozentuale Breite geben. (Etwas wie 80% für den Gastgeber, 20% für den Hafen.) Ist das möglich? Das folgende XML funktioniert auf meinem Droid, aber es scheint nicht für alle Bildschirme zu arbeiten. Ich würde wirklich eine robustere Lösung haben.

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/host_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/home" android:paddingLeft="15dp" android:paddingTop="0dp" android:text="host" android:textColor="#a5d4e2" android:textSize="25sp" android:textStyle="normal" /> <TextView android:id="@+id/port_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/home" android:layout_toRightOf="@+id/host_input" android:paddingTop="0dp" android:text="port" android:textColor="#a5d4e2" android:textSize="25sp" android:textStyle="normal" /> <EditText android:id="@+id/host_input" android:layout_width="172dp" android:layout_height="wrap_content" android:layout_below="@id/host_label" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_marginTop="4dp" android:background="@android:drawable/editbox_background" android:inputType="textEmailAddress" /> <EditText android:id="@+id/port_input" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_below="@id/host_label" android:layout_marginTop="4dp" android:layout_toRightOf="@id/host_input" android:background="@android:drawable/editbox_background" android:inputType="number" /> <TextView android:id="@+id/username_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/host_input" android:paddingLeft="15dp" android:paddingTop="15dp" android:text="username" android:textColor="#a5d4e2" android:textSize="25sp" android:textStyle="normal" /> <EditText android:id="@+id/username_input" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/username_label" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_marginTop="4dp" android:background="@android:drawable/editbox_background" android:inputType="textEmailAddress" /> <TextView android:id="@+id/password_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/username_input" android:paddingLeft="15dp" android:paddingTop="15dp" android:text="password" android:textColor="#a5d4e2" android:textSize="25sp" android:textStyle="normal" /> <EditText android:id="@+id/password_input" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/password_label" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_marginTop="4dp" android:background="@android:drawable/editbox_background" android:inputType="textPassword" /> <ImageView android:id="@+id/home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_centerVertical="false" android:paddingLeft="15dp" android:paddingRight="15dp" android:paddingTop="15dp" android:scaleType="fitStart" android:src="@drawable/home" /> <Button android:id="@+id/login_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/password_input" android:layout_marginLeft="15dp" android:layout_marginTop="15dp" android:text=" login " android:textSize="18sp" > </Button> </RelativeLayout> 

  • Warnungen mit Proguard (mit externen Bibliotheken)
  • Android - Webview, Eingabefelder verdoppelt?
  • Erste Android Studio, Gradle und Android Annotations zusammenarbeiten
  • Android 4.4.4 Moto G Bluetooth LE wieder anschließen Problem
  • Unterstützung beider Orientierungsansichten in Honeycomb
  • Mein Fragment kann nicht auf android.support.v4.app.Fragment geworfen werden
  • 14 Solutions collect form web for “Prozentsatzbreite in einem RelativeLayout”

    Sie suchen nach dem android:layout_weight Attribut. Es erlaubt Ihnen, Prozentsätze zu verwenden, um Ihr Layout zu definieren.

    Im folgenden Beispiel verwendet die linke Schaltfläche 70% des Platzes und die rechte Taste 30%.

     <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:text="left" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".70" /> <Button android:text="right" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".30" /> </LinearLayout> 

    Es funktioniert das gleiche mit jeder Art von View, können Sie ersetzen die Schaltflächen mit einigen EditText, um Ihre Bedürfnisse anzupassen.

    layout_width Sie darauf, die layout_width auf layout_width zu 0dp oder Ihre Ansichten werden möglicherweise nicht ordnungsgemäß skaliert.

    Beachten Sie, dass die Gewichtssumme nicht gleich 1 sein muss, ich finde es einfacher, so zu lesen. Sie können das erste Gewicht auf 7 und das zweite auf 3 setzen und es wird das gleiche Ergebnis geben.

    Das entspricht nicht ganz der ursprünglichen frage, die für eine 70/30 geteilte, aber im speziellen fall eines 50/50 geteilten zwischen den komponenten gibt es einen weg: platzieren sie eine unsichtbare strebe in der mitte und benutze sie, um sie zu positionieren Zwei interessante Komponenten.

     <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <View android:id="@+id/strut" android:layout_width="0dp" android:layout_height="0dp" android:layout_centerHorizontal="true"/> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignRight="@id/strut" android:layout_alignParentLeft="true" android:text="Left"/> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignLeft="@id/strut" android:layout_alignParentRight="true" android:text="Right"/> </RelativeLayout> 

    Da dies ein ziemlich üblicher Fall ist, ist diese Lösung mehr als eine Neugier. Es ist ein bisschen ein Hack, aber ein effizienter, weil die leere, nullgroße Strebe sehr wenig kosten sollte.

    Im Allgemeinen, aber es ist am besten nicht zu viel von der Lager Android-Layouts zu erwarten …

    Update 1

    Wie von @EmJiHash angezeigt wird, ist PercentRelativeLayout in API Level 26.0.0 veraltet

    Unter zitieren Google Kommentar:

    Diese Klasse wurde in API Level 26.0.0 veraltet. Verwenden Sie stattdessen ConstraintLayout und zugehörige Layouts. Im Folgenden wird gezeigt, wie die Funktionalität von prozentualen Layouts mit einem ConstraintLayout repliziert werden kann


    Google hat neue API namens android.support.percent eingeführt

    Dann können Sie nur den Prozentsatz angeben

    Add compile Abhängigkeit wie

     compile 'com.android.support:percent:22.2.0 

    In diesem, PercentRelativeLayout ist, was wir ein prozentuales kluges Layout machen können

      <android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView app:layout_widthPercent="50%" app:layout_heightPercent="50%" app:layout_marginTopPercent="25%" app:layout_marginLeftPercent="25%"/> </android.support.percent.PercentRelativeLayout> 

    Sie können keine Prozentsätze verwenden, um die Dimensionen einer Ansicht innerhalb eines RelativeLayouts zu definieren. Die besten Möglichkeiten, es zu tun ist, verwenden Sie LinearLayout und Gewichte oder ein benutzerdefiniertes Layout.

    Sie können sich die neue Prozent-Support-Bibliothek ansehen.

     compile 'com.android.support:percent:22.2.0' 

    Docs

    Sample

    Sie können PercentRelativeLayout verwenden , es ist eine neuere undokumentierte Ergänzung zur Design Support Library , ermöglicht die Möglichkeit, nicht nur Elemente relativ zueinander, sondern auch den Gesamtprozentsatz des verfügbaren Platzes anzugeben.

    Unterklasse von RelativeLayout, die prozentuale Dimensionen und Ränder unterstützt. Sie können die Dimension oder einen Rand des Kindes angeben, indem Sie Attribute mit "Percent" -Suffix verwenden.

     <android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_widthPercent="50%" app:layout_heightPercent="50%" app:layout_marginTopPercent="25%" app:layout_marginLeftPercent="25%"/> </android.support.percent.PercentFrameLayout> 

    Das Percent-Paket bietet APIs, um das Hinzufügen und Verwalten von prozentualen Dimensionen in Ihrer App zu unterstützen.

    Um zu verwenden, müssen Sie diese Bibliothek zu Ihrer Gradle-Abhängigkeitsliste hinzufügen:

     dependencies { compile 'com.android.support:percent:22.2.0'//23.1.1 } 

    Ich habe das Problem gelöst.

     public class FractionalSizeView extends View { public FractionalSizeView(Context context, AttributeSet attrs) { super(context, attrs); } public FractionalSizeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); setMeasuredDimension(width * 70 / 100, 0); } } 

    Dies ist unsichtbare Strebe, die ich verwenden kann, um andere Ansichten innerhalb von RelativeLayout auszurichten.

    Google hat neue API namens android.support.percent eingeführt

    1) PercentRelativeLayout

    2) PercentFrameLayout

    Add compile Abhängigkeit wie

     compile 'com.android.support:percent:23.1.1' 

    Sie können Dimension in Prozentsatz angeben, so erhalten beide Vorteile von RelativeLayout und Prozentsatz

      <android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"/> <TextView app:layout_widthPercent="40%" app:layout_heightPercent="40%" app:layout_marginTopPercent="15%" app:layout_marginLeftPercent="15%"/> </android.support.percent.PercentRelativeLayout/> 

    PercentRelativeLayout wird aus Revision 26.0.0 der Support-Bibliothek veraltet.

    Google hat ein neues Layout namens ConstraintLayout eingeführt .

    Füge die Bibliothek als Abhängigkeit in deiner Modulebene hinzu build.gradle file:

      dependencies { compile 'com.android.support.constraint:constraint-layout:1.0.1' } 

    Füge einfach eine Layoutdatei hinzu:

     <?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" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.constraint.ConstraintLayout> 

    Einschränkungen

    Einschränkungen helfen Ihnen, Widgets ausgerichtet zu halten. Sie können Anker verwenden, wie die unten aufgeführten Einschränkungshandgriffe, um die Ausrichtungsregeln zwischen verschiedenen Widgets zu bestimmen.

    1. Wrap Content : Die Ansicht erweitert sich nach Bedarf um den Inhalt zu passen.
    2. Match Constraints : Die Ansicht erweitert sich nach Bedarf um die Definition ihrer Einschränkungen nach der Bilanzierung von Margen. Wenn jedoch die gegebene Dimension nur eine Einschränkung hat, dann erweitert sich die Ansicht auf ihren Inhalt. Wenn Sie diesen Modus entweder auf der Höhe oder der Breite verwenden, können Sie auch ein Größenverhältnis einstellen.
    3. Fixed : Sie geben eine bestimmte Dimension im Textfeld unten an oder indem Sie die Ansicht im Editor ändern.
    4. Spread : Die Ansichten sind gleichmäßig verteilt (nach Margen werden berücksichtigt). Dies ist die Voreinstellung.
    5. Spread inside : Die erste und letzte Ansicht sind an den Einschränkungen an jedem Ende der Kette angebracht und der Rest ist gleichmäßig verteilt.
    6. Weighted : Wenn die Kette so eingestellt ist, dass sie sich entweder verbreitet oder verbreitet, können Sie den verbleibenden Platz füllen, indem Sie eine oder mehrere Ansichten auf "Übereinstimmungsbeschränkungen" (0dp) setzen. Standardmäßig ist der Platz gleichmäßig zwischen jeder Ansicht verteilt, die auf "Match-Constraints" gesetzt ist, aber Sie können jedem View ein Gewicht von Bedeutung über die Attribute layout_constraintHorizontal_weight und layout_constraintVertical_weight zuweisen. Wenn Sie mit Layout_weight in einem linearen Layout vertraut sind, funktioniert das auf die gleiche Weise. Also die Aussicht mit dem höchsten Gewichtswert bekommt die meisten Platz, Ansichten, die das gleiche Gewicht haben, bekommen die gleiche Menge an Platz.
    7. Packed : Die Ansichten sind zusammengepackt (nach Margen werden berücksichtigt). Sie können dann die Vorspannung der gesamten Kette (links / rechts oder oben / unten) anpassen, indem Sie die Kopfsicht der Kette ändern.
    8. Center Horizontally or Center Vertically : Um eine Kette von Ansichten schnell zu erstellen, markieren Sie sie alle, klicken Sie mit der rechten Maustaste auf eine der Ansichten und wählen Sie dann entweder Mitte horizontal oder Mitte vertikal, um entweder eine horizontale oder vertikale Kette zu erstellen
    9. Baseline alignment : Richten Sie die Textbasislinie einer Ansicht auf die Textbasislinie einer anderen Ansicht aus.
    10. Constrain to a guideline : Sie können eine vertikale oder horizontale Richtlinie hinzufügen, auf die Sie Ansichten einschränken können, und die Richtlinie wird für App-Benutzer unsichtbar sein. Sie können die Leitlinie innerhalb des Layouts auf der Basis von dp-Einheiten oder Prozent, bezogen auf die Layout-Kante, positionieren.
    11. Adjust the constraint bias : Wenn Sie eine Einschränkung für beide Seiten einer Ansicht hinzufügen (und die Ansichtsgröße für dieselbe Dimension ist entweder "fixiert" oder "wrap content"), wird die Ansicht zwischen den beiden Einschränkungen mit einer Vorspannung von 50 zentriert % Standardmäßig Sie können die Vorspannung durch Ziehen des Bias-Schiebereglers im Eigenschaftenfenster anpassen
    12. Set size as a ratio : Sie können die Ansichtsgröße auf ein Verhältnis wie 16: 9 einstellen, wenn mindestens eine der Ansichtsdimensionen auf "Übereinstimmungsbeschränkungen" (0dp) gesetzt ist.

    Sie können mehr vom offiziellen doc erfahren.

    Sie können dies über Layoutgewichte erreichen. Ein Gewicht diktiert, wie die nicht beanspruchten Teile des Bildschirms aufgeteilt sind. Geben Sie jedem EditText eine Layout_width von 0 und etwas proportionales Gewicht. Dh, geben Sie ein Gewicht von 2, und das andere ein Gewicht von 1, wenn Sie möchten, dass der erste doppelt so viel Platz einnimmt.

    Interessanterweise, auf die Antwort von @olefevre aufbauen, kann man nicht nur 50/50 Layouts mit "unsichtbaren Streben", sondern alle Arten von Layouts mit zwei Potenzen.

    Zum Beispiel ist hier ein Layout, das die Breite in vier gleiche Teile schneidet (eigentlich drei, mit Gewichten von 1, 1, 2):

     <?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="wrap_content" > <View android:id="@+id/strut" android:layout_width="1dp" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:background="#000000" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@+id/strut" > <View android:id="@+id/left_strut" android:layout_width="1dp" android:layout_height="match_parent" android:layout_toLeftOf="@+id/strut" android:layout_centerHorizontal="true" android:background="#000000" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignRight="@+id/left_strut" android:text="Far Left" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_toRightOf="@+id/left_strut" android:text="Near Left" /> </RelativeLayout> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignLeft="@id/strut" android:layout_alignParentRight="true" android:text="Right" /> </RelativeLayout> 

    Setzen Sie einfach Ihre beiden Textviews Host und Port in einem unabhängigen linearenlayout horizontal und verwenden Sie Android: layout_weight, um den Prozentsatz zu machen

    Überprüfen Sie https://github.com/mmin18/FlexLayout, mit dem Sie Prozent- oder Java-Ausdruck direkt im Layout xml verwenden können.

     <EditText app:layout_left="0%" app:layout_right="60%" app:layout_height="wrap_content"/> <EditText app:layout_left="prev.right+10dp" app:layout_right="100%" app:layout_height="wrap_content"/> 

    Verwenden Sie neue Prozent-Support-Bibliothek.

      compile 'com.android.support:percent:24.0.0' 

    Ex:

      <android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/host_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/home" android:paddingLeft="15dp" android:paddingTop="0dp" android:text="host" android:textColor="#a5d4e2" android:textSize="25sp" android:textStyle="normal" /> <TextView android:id="@+id/port_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/home" android:layout_toRightOf="@+id/host_input" android:paddingTop="0dp" android:text="port" android:textColor="#a5d4e2" android:textSize="25sp" android:textStyle="normal" /> <EditText android:id="@+id/host_input" app:layout_widthPercent="45%" android:layout_height="wrap_content" android:layout_below="@id/host_label" app:layout_marginLeftPercent="4%" app:layout_marginTopPercent="2.7%" app:layout_marginRightPercent="4%" android:background="@android:drawable/editbox_background" android:inputType="textEmailAddress" /> <EditText android:id="@+id/port_input" android:layout_width="100dp" app:layout_widthPercent="26.1%" app:layout_marginTopPercent="2.7%" android:layout_height="wrap_content" android:layout_below="@id/host_label" android:layout_toRightOf="@id/host_input" android:background="@android:drawable/editbox_background" android:inputType="number" /> <TextView android:id="@+id/username_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/host_input" app:layout_marginLeftPercent="4%" app:layout_marginTopPercent="2.7%" android:text="username" android:textColor="#a5d4e2" android:textSize="25sp" android:textStyle="normal" /> <EditText android:id="@+id/username_input" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/username_label" app:layout_marginLeftPercent="4%" app:layout_marginTopPercent="2.7%" app:layout_marginRightPercent="4%" android:background="@android:drawable/editbox_background" android:inputType="textEmailAddress" /> <TextView android:id="@+id/password_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/username_input" app:layout_marginLeftPercent="4%" app:layout_marginTopPercent="2.7%" app:layout_marginRightPercent="4%" android:text="password" android:textColor="#a5d4e2" android:textSize="25sp" android:textStyle="normal" /> <EditText android:id="@+id/password_input" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/password_label" app:layout_marginLeftPercent="4%" app:layout_marginTopPercent="2.7%" app:layout_marginRightPercent="4%" android:background="@android:drawable/editbox_background" android:inputType="textPassword" /> <ImageView android:id="@+id/home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_centerVertical="false" app:layout_marginLeftPercent="4%" app:layout_marginTopPercent="2.7%" app:layout_marginRightPercent="4%" android:scaleType="fitStart" android:src="@drawable/home" /> <Button android:id="@+id/login_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/password_input" app:layout_marginLeftPercent="4%" app:layout_marginTopPercent="2.7%" android:text=" login " android:textSize="18sp" > </Button> </android.support.percent.PercentRelativeLayout> 

    * Für Sample & Tutorial * Tutorial1 Tutorial2 Tutorial3

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.