Przycisk Wyrównanie do prawej w układzie poziomym LinearLayout


132

Jeśli spojrzysz na załączony obraz. Potrzebuję, aby mój przycisk był wyrównany do prawej strony, ale z jakiegoś powodu nie działa z `` grawitacją: dobrze '' ...

Anuluj Dodaj

Oto mój kod dla tego układu:

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

Dlaczego nie działa ?!


6
W tym przypadku wypróbuj układ względny. LL nie zadziała,
AAnkit

4
Jeśli chcesz użyć LinearLayout, użyj dwóch wewnętrznych linearlayouts i użyj layout_weight wraz z layout_gravity. Będzie działać dobrze.
Vamsi Challa

@VamsiChalla jest to możliwe z jednym, sprawdź moją nową odpowiedź poniżej.
TWiStErRob

Odpowiedzi:


139

Użyj do tego poniższego kodu

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

3
Wygląda na to, że atrybut „layout_alignParentRight” nie jest dostępny dla przycisku w tym przypadku? Może wycofane?

20
ru używając układu relatywnego zamiast układu liniowego?
Dipak Keshariya

1
Ach cholera .. Przepraszam za to, całkowicie to przeszedłem. Dzięki!

4
Wciąż zadziwia mnie, jak coś, co wydaje się tak łatwe, staje się tak trudne przy próbie użycia linearnego układu.
AlvaroSantisteban

2
@DipakKeshariya dla przyszłych widzów, możesz użyć „android: layout_gravity =" top | right "linearlayout
SupimpaAllTheWay

148

Jedno LinearLayoutrozwiązanie. Dodanie tylko prostego widoku odstępów:
(Wydawało się, że nikt nie wspomniał o tym, tylko bardziej skomplikowane rozwiązania z wieloma układami).

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

Zwróć uwagę na „podświetlony” widok, niczego innego nie modyfikowałem. Wysokość = 0 zapewnia, że ​​nie jest widoczna. Szerokość = 0 wynika z tego, że szerokość jest określana na LinearLayoutpodstawie wagi = 1. Oznacza to, że widok elementu dystansowego będzie maksymalnie rozciągany w kierunku (orientacji) LinearLayout.

Zauważ, że powinieneś użyć android.widget.Spacelub android.support.v4.widget.Spacezamiast,View jeśli twój poziom API i / lub zależności na to pozwalają. Spacewykonuje pracę w tańszy sposób, bo tylko mierzy i nie próbuje narysować czegoś takiego jak Viewrobi; jest też bardziej wyrazisty i przekazuje intencję.


2
Po prostu dodaj android: layout_weight = "1" do R.id.lblExpenseCancel i to wszystko.
hrules6872

1
@h_rules, które działa, jeśli chcesz zhakować, ale wyobraź sobie, co się stanie, gdy dodasz tło do TextView.
TWiStErRob

2
Zastanawiam się, dlaczego ta odpowiedź została odrzucona, działa i jest fajnie, zdecydowanie spróbuję.
Elvedin Hamzagic

To jest idealne rozwiązanie dla programistów mobilnych
Shivanand Darur

1
@GeoMint layout_weight="1"nadaje mu dynamiczny rozmiar, co oznacza „bądź tak szeroki, jak tylko możesz” (ponieważ LinearLayoutjest horizontal). width = 0dpsłuży tylko do wydajności , w rzeczywistości nie będzie miała 0 szerokości. Mam wrażenie, że nawet nie wypróbowałeś kodu ...
TWiStErRob

34

Prawdziwe rozwiązanie w tym przypadku:

android:layout_weight="1" dla TextView, a przycisk przesunie się w prawo!


29

Wiem, że to pytanie zostało zadane jakiś czas temu, ale robiłem to już wcześniej i pozwala to na większą kontrolę podczas wyrównywania elementów. Jeśli spojrzysz na to jak na programowanie internetowe, to pomaga. Po prostu zagnieżdżasz kolejny, LinearLayoutktóry będzie zawierał twój przycisk w środku. Następnie możesz zmienić wagę układu przycisku i skierować go w prawo, podczas gdy TextViewnadal znajduje się on po lewej stronie.

Wypróbuj ten kod:

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

Być może będziesz musiał bawić się dopełnieniem w zagnieżdżonym układzie, aby działał tak, jak chcesz.


2
W zagnieżdżonym układzie należy użyć FrameLayout. Do umieszczenia pojedynczego elementu służy to. A także nadaj mu wagę, aby wypełniała prawą część rodzica. +1 za niestosowanie układu względnego.
Hjalmar

10

Spróbuj tego

 <?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>

9

Jak wspomniano kilka razy wcześniej: Przełączanie się z LinearLayout na RelativeLayout działa, ale możesz też rozwiązać problem zamiast go unikać. Użyj narzędzi, które zapewnia LinearLayout: Nadaj TextView wagę = 1 (patrz kod poniżej), waga twojego przycisku powinna pozostać 0 lub żadna. W tym przypadku TextView zajmie całą pozostałą przestrzeń, która nie jest używana do wyświetlenia zawartości Twojego TextView lub ButtonView, i przesunie przycisk w prawo.

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

2
To najlepsza odpowiedź. Chciałem tylko napisać coś podobnego, dopóki nie znalazłem twojego postu.
codingdave

To o wiele lepsze niż przejście na z RelativeLayoutpowodu problemów z pamięcią, ponieważ RelativeLayoutzużywa znacznie więcej pamięci niżLinearLayout
ThunderWiring

7

Musisz dodać grawitację do układu, a nie do przycisku, grawitacja w ustawieniach przycisku dotyczy tekstu wewnątrz przycisku

<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">

2
Czy nie spowodowałoby to również odpowiedniego wyrównania TextView? Potrzebuję tylko przycisku wyrównanego do prawej ...

1
Jeśli chcesz wyrównać tylko przycisk, użyj RelativeLayout.
goodm

1
Nawet jeśli chcesz, aby wszystkie przyciski były wyrównane, to nie działa (API 16). Widoki podrzędne są nadal wyrównane do lewej.
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>

To rozwiąże twój problem


4

Po prostu dodaj android: gravity = "right", ten układ nadrzędny linii to zadziała.

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

4

Jeśli nie chcesz lub nie możesz użyć RelativeLayout, możesz zawinąć przycisk w LinearLayout z orientacją „vertical” i szerokością „fill_parent”.

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

Dzieje się tak, ponieważ jeśli orientacja LinearLayout jest pozioma, grawitacja wpłynie tylko na widoki w pionie. A jeśli orientacja jest „pionowa”, grawitacja wpłynie tylko na widoki w poziomie. Zobacz tutaj, aby uzyskać więcej szczegółów na temat wyjaśnienia orientacji / grawitacji LinearLayout.


0

Użyłem podobnego układu z 4 TextViews. Dwa TextViews powinny być wyrównane do lewej, a dwa TextViewdo prawej. Więc oto moje rozwiązanie, jeśli chcesz używać LinearLayoutssam.

<?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>

0

Możesz użyć RelativeLayout lub ustawić gravity = "right" w układzie nadrzędnym swojego Button.


0

Wiem, że to jest stare, ale tutaj jest inny w układzie liniowym:

<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" />

Zwróć uwagę na layout_gravity, a nie tylko na grawitację.


O co chodzi center_vertical|bottom|top? Dla mnie wyglądają jak ekskluzywne grawitacje wyrównania.
TWiStErRob

0

Jako główny układ należy użyć układu relatywnego zamiast układu liniowego. Jeśli używasz układu Relativelayout jako głównego, z łatwością obsłuż przycisk po prawej stronie, ponieważ układ względny zapewnia nam alignParent right, left, top and bottom.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.