Rechte Ausrichtungsschaltfläche im horizontalen LinearLayout

130

Wenn Sie sich das angehängte Bild ansehen. Ich muss meinen Knopf richtig ausrichten, aber aus irgendeinem Grund funktioniert er nicht mit 'Schwerkraft: richtig' ...

Abbrechen Hinzufügen

Hier ist mein Code für dieses Layout:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="35dp">

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/cancel"
        android:textColor="#404040"
        android:layout_marginLeft="10dp"
        android:textSize="20sp"
        android:layout_marginTop="9dp" />

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"
        android:text="@string/add"
        android:layout_gravity="right"
        android:layout_marginRight="15dp" />

</LinearLayout>

Warum funktioniert das nicht?!

ROMANIA_engineer
quelle
6
Versuchen Sie in diesem Fall das relative Layout. LL wird nicht funktionieren,
AAnkit
4
Wenn Sie LinearLayout verwenden möchten, verwenden Sie zwei innere lineare Layouts und verwenden Sie layout_weight zusammen mit layout_gravity. Es wird gut funktionieren.
Vamsi Challa
@VamsiChalla es ist möglich mit einem, überprüfen Sie meine neue Antwort unten.
TWiStErRob

Antworten:

137

Verwenden Sie dazu den folgenden Code

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="35dp"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="9dp"
        android:text="@string/cancel"
        android:textColor="#404040"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="15dp"
        android:background="@drawable/stitch_button"
        android:text="@string/add" />

</RelativeLayout>
Dipak Keshariya
quelle
3
Es scheint, dass das Attribut 'layout_alignParentRight' in diesem Fall für die Schaltfläche nicht verfügbar ist. Vielleicht veraltet?
20
Ru Relativelayout anstelle von Linearlayout verwenden?
Dipak Keshariya
1
Ah Mist .. Tut mir leid, ich habe komplett darüber hinweggesehen. Vielen Dank!
4
Es wundert mich immer noch, wie schwierig es wird, ein lineares Layout zu verwenden, wenn etwas so einfach erscheint.
AlvaroSantisteban
2
@ DipakKeshariya für zukünftige Zuschauer könnten Sie "android: layout_gravity =" top | right "linearlayout
SupimpaAllTheWay
145

LinearLayoutEinzellösung. Nur eine einfache Abstandsansicht hinzufügen:
(Niemand schien diese erwähnt zu haben, nur kompliziertere Multi-Layout-Lösungen.)

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="35dp">

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/cancel"
        android:textColor="#404040"
        android:layout_marginLeft="10dp"
        android:textSize="20sp"
        android:layout_marginTop="9dp" />

    <!-------------------------  ADDED SPACER VIEW -------------------->
    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1"
        />
    <!------------------------- /ADDED SPACER VIEW -------------------->

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"
        android:text="@string/add"
        android:layout_gravity="right"
        android:layout_marginRight="15dp" />

</LinearLayout>

Beachten Sie die "hervorgehobene" Ansicht, ich habe nichts anderes geändert. Höhe = 0 stellt sicher, dass es nicht sichtbar ist. Breite = 0 ist, weil die Breite durch das LinearLayoutbasierend auf Gewicht = 1 bestimmt wird. Dies bedeutet, dass sich die Abstandshalteransicht so weit wie möglich in Richtung (Ausrichtung) des LinearLayout.

Beachten Sie,android.widget.Spaceandroid.support.v4.widget.SpaceView dass Sie oder anstelle von verwenden sollten, wenn Ihre API-Ebene und / oder Abhängigkeiten dies zulassen. Spaceerreicht den Job auf eine billigere Art und Weise, weil er nur misst und nicht versucht, etwas Ähnliches zu zeichnen View; es ist auch ausdrucksvoller, die Absicht zu vermitteln.

TWiStErRob
quelle
2
Fügen Sie einfach android: layout_weight = "1" zu R.id.lblExpenseCancel hinzu und das ist alles.
hrules6872
1
@h_rules, das funktioniert, wenn Sie hacken möchten, aber stellen Sie sich vor, was passiert, wenn Sie der Textansicht Hintergrundinformationen hinzufügen.
TWiStErRob
2
Ich frage mich, warum diese Antwort abgelehnt wurde, sie funktioniert und es ist schön, ich werde es auf jeden Fall versuchen.
Elvedin Hamzagic
Das ist perfekt als mobiler Entwickler
Shivanand Darur
Wenn Sie einen Abstandshalter hinzufügen, erhalten Sie bei unterschiedlichen Bildschirmgrößen unterschiedliche Ergebnisse. Es ist also nicht die ideale Lösung.
GeoMint
28

Ich weiß, dass diese Frage vor einiger Zeit gestellt wurde, aber ich habe dies bereits getan und sie ermöglicht mehr Kontrolle beim Ausrichten von Elementen. Wenn Sie sie wie Webprogrammierung betrachten, hilft sie. Sie verschachteln einfach eine andere LinearLayout, die Ihre Schaltfläche enthält. Sie können dann die Schwerkraft des Schaltflächenlayouts ändern und es nach rechts verschieben, während sich das Layout TextViewnoch auf der linken Seite befindet.

Versuchen Sie diesen Code:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"             
android:orientation="horizontal" 
android:layout_marginTop="35dp">

<TextView
    android:id="@+id/lblExpenseCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cancel" 
    android:textColor="#404040"         
    android:layout_marginLeft="10dp" 
    android:textSize="20sp" 
    android:layout_marginTop="9dp"/>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="right"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"                    
        android:text="@string/add" 
        android:layout_gravity="right" 
        android:layout_marginRight="15dp"/>

</LinearLayout>

Möglicherweise müssen Sie mit dem Auffüllen des verschachtelten Layouts spielen, damit es so funktioniert, wie Sie es möchten.

BobbyD17
quelle
2
Sie sollten ein FrameLayout für Ihr verschachteltes Layout verwenden. Ein einzelnes Element zu positionieren ist das, wofür es ist. Geben Sie ihm auch ein Gewicht, damit es den richtigen Teil des Elternteils ausfüllt. +1 für das ohnehin nicht verwendete relative Layout.
Hjalmar
28

Echte Lösung für diesen Fall:

android:layout_weight="1" für TextView und Ihre Schaltfläche nach rechts bewegen!

nicolas asinovich
quelle
10

Probier diese

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_gravity="right" 
    android:layout_height="wrap_content"             
    android:orientation="horizontal"  >

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
   android:layout_height="wrap_content"   
   android:orientation="horizontal" >

<TextView
    android:id="@+id/lblExpenseCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="9dp"
    android:text="cancel"
    android:textColor="#ffff0000"
    android:textSize="20sp" />

<Button
    android:id="@+id/btnAddExpense"
    android:layout_width="wrap_content"
    android:layout_height="45dp"
    android:layout_alignParentRight="true"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="15dp"
     android:textColor="#ff0000ff"
    android:text="add" />

 </RelativeLayout>
  </LinearLayout>
NagarjunaReddy
quelle
9

Wie bereits einige Male erwähnt: Der Wechsel von LinearLayout zu RelativeLayout funktioniert, aber Sie können das Problem auch lösen, anstatt es zu vermeiden. Verwenden Sie die Werkzeuge, die ein LinearLayout bietet: Geben Sie der Textansicht eine Gewichtung = 1 (siehe Code unten), die Gewichtung für Ihre Schaltfläche sollte 0 oder keine bleiben. In diesem Fall nimmt die Textansicht den gesamten verbleibenden Speicherplatz ein, der nicht zum Anzeigen des Inhalts Ihrer Textansicht oder ButtonView verwendet wird, und drückt Ihre Schaltfläche nach rechts.

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="35dp">

        <TextView
            android:id="@+id/lblExpenseCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/cancel"
            android:textColor="#404040"
            android:layout_marginLeft="10dp"
            android:textSize="20sp"
            android:layout_marginTop="9dp"

            **android:layout_weight="1"**

            />

        <Button
            android:id="@+id/btnAddExpense"
            android:layout_width="wrap_content"
            android:layout_height="45dp"
            android:background="@drawable/stitch_button"
            android:layout_marginLeft="10dp"
            android:text="@string/add"
            android:layout_gravity="right"
            android:layout_marginRight="15dp" />

    </LinearLayout>
Widerhaken
quelle
2
Dies ist die beste Antwort. Ich wollte nur etwas Ähnliches schreiben, bis ich Ihren Beitrag gefunden habe.
Codingdave
Das ist viel besser als das Wechseln zu RelativeLayoutaufgrund von Speicherproblemen, da das RelativeLayoutviel mehr Speicher verbraucht alsLinearLayout
ThunderWiring
7

Sie müssen dem Layout die Schwerkraft hinzufügen, nicht die Schaltfläche. Die Schwerkraft in den Schaltflächeneinstellungen gilt für Text innerhalb der Schaltfläche

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_gravity="right" 
android:layout_height="wrap_content"             
android:orientation="horizontal" 
android:layout_marginTop="35dp">
goodm
quelle
2
Würde das dann nicht auch die Textansicht richtig ausrichten? Ich brauche nur die Schaltfläche rechts ausgerichtet ...
1
Wenn Sie nur die Schaltfläche ausrichten müssen, verwenden Sie RelativeLayout.
Goodm
1
Selbst wenn alle Schaltflächen ausgerichtet sein sollen, funktioniert dies nicht (API 16). Die Ansichten der Kinder sind weiterhin links ausgerichtet.
m0skit0
5
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"             
    android:orientation="horizontal" 
    android:layout_marginTop="35dp">

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="0dp"
        android:layout_weight="0.5"
        android:layout_height="wrap_content"
        android:text="@string/cancel" 
        android:textColor="#404040"         
        android:layout_marginLeft="10dp" 
        android:textSize="20sp" 
        android:layout_marginTop="9dp"/>              

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="0dp"
        android:layout_weight="0.5"
        android:layout_height="wrap_content"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"                    
        android:text="@string/add" 
        android:layout_gravity="right" 
        android:layout_marginRight="15dp"/>

</LinearLayout>

Dies wird Ihr Problem lösen

Anand S Joshi
quelle
3

Wenn Sie RelativeLayout nicht verwenden möchten oder können, können Sie die Schaltfläche in ein LinearLayout mit der Ausrichtung "vertikal" und der Breite "fill_parent" einschließen.

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:layout_marginTop="35dp">

  <TextView
      android:id="@+id/lblExpenseCancel"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/cancel"
      android:textColor="#404040"
      android:layout_marginLeft="10dp"
      android:textSize="20sp"
      android:layout_marginTop="9dp" />

  <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical">
     <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"
        android:text="@string/add"
        android:layout_gravity="right"
        android:layout_marginRight="15dp" />
  </LinearLayout>
</LinearLayout> 

Dies liegt daran, dass die Schwerkraft die Ansichten nur vertikal beeinflusst, wenn die Ausrichtung des LinearLayout horizontal ist. Wenn die Ausrichtung "vertikal" ist, wirkt sich die Schwerkraft nur horizontal auf die Ansichten aus. Weitere Informationen zur Erklärung der Ausrichtung / Schwerkraft des LinearLayout finden Sie hier .

Stephanie Gu
quelle
2

Fügen Sie einfach android :vity = "right" hinzu. Dieses übergeordnete Linienlayout funktioniert.

<LinearLayout
        android:id="@+id/withdrawbuttonContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@color/colorPrimary"
        android:orientation="horizontal"
        **android:gravity="right"**
        android:weightSum="5"
        android:visibility="visible">

        <Button
            android:id="@+id/bt_withDraw"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/BTN_ADD"
            app:delay="1500" />

        <Button
            android:id="@+id/btn_orderdetail_amend"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/BTN_CANCEL"
            app:delay="1500" />
</LinearLayout>
velraj
quelle
0

Ich habe ein ähnliches Layout mit 4 TextViews verwendet. Zwei TextViews sollten nach links und zwei TextViews nach rechts ausgerichtet sein. Also, hier ist meine Lösung, wenn Sie LinearLayoutsalleine verwenden möchten .

<?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="wrap_content"
    android:orientation="horizontal"
    android:baselineAligned="false"
    android:padding="10dp" >

    <LinearLayout
        android:layout_width="0dip"
        android:layout_weight="0.50"
        android:layout_height="match_parent"
        android:gravity="left"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_level"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/level"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_level_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dip"
        android:layout_weight="0.50"
        android:layout_height="match_parent"
        android:gravity="right"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/time"
            android:textAppearance="?android:attr/textAppearanceMedium"
             />

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_time_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceMedium" 
            />
    </LinearLayout>

</LinearLayout>
Vamsi Challa
quelle
0

Sie können RelativeLayout verwenden oder im übergeordneten Layout Ihrer Schaltfläche die Schwerkraft = "rechts" festlegen.

HuynhHan
quelle
0

Ich weiß, dass dies alt ist, aber hier ist eine andere in einem linearen Layout wäre:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="35dp">

<TextView
    android:id="@+id/lblExpenseCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cancel"
    android:textColor="#404040"
    android:layout_marginLeft="10dp"
    android:textSize="20sp"
    android:layout_marginTop="9dp" />

<Button
    android:id="@+id/btnAddExpense"
    android:layout_width="wrap_content"
    android:layout_height="45dp"
    android:background="@drawable/stitch_button"
    android:layout_marginLeft="10dp"
    android:text="@string/add"
    android:layout_gravity="center_vertical|bottom|right|top"
    android:layout_marginRight="15dp" />

Bitte beachten Sie die layout_gravity im Gegensatz zur reinen Schwerkraft.

Juanjo
quelle
Was ist center_vertical|bottom|toplos? Sie sehen für mich wie exklusive Schwerkraft aus.
TWiStErRob
0

Sie sollten das relative Layout anstelle des linearen Layouts als Hauptlayout verwenden. Wenn Sie Relativelayout als Hauptfunktion verwenden, können Sie die Schaltfläche auf der rechten Seite leicht bedienen, da das relative Layout uns alignParent rechts, links, oben und unten bietet.

Farhan Ghaffar
quelle
-2

Verwenden Sie die Layoutbreite in der Schaltfläche wie Android: layout_width = "75dp"

Wegen Negativität gelöscht
quelle