Jak wyrównać widget w prawo w poziomym układzie liniowym Androida?


205

Oto kod, którego używam i nie działa:

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

    <TextView android:text="TextView" android:id="@+id/textView1"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:gravity="right">
    </TextView>

</LinearLayout>

Odpowiedzi:


418

Spróbuj dodać pusty Viewwewnątrz poziomej LinearLayoutprzed elementem, który chcesz zobaczyć po prawej stronie, np .:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />                

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

11
To działa! Ale każdy może wyjaśnić, dlaczego? Nie mogłem całkowicie zrozumieć.
GMsoF,

28
Pusty widok próbuje zająć maksymalną ilość miejsca, pozostawiając miejsce dla przycisku.
alcsan

14
Do tej pory była to jedyna rzecz, która działa dla mnie, próbując mieć kilka przycisków po lewej stronie i jeden ostatni przycisk po prawej stronie. Ale wydaje mi się, że to hack. Czy istnieje „właściwy” sposób, aby to zrobić?
IcedDante

8
To jest niesamowite! Ale dlaczego grawitacja = „prawo” nie działa w ten sposób od samego początku? Dlaczego potrzebuje pomocy z tego innego punktu widzenia? A jak to jest „właściwe”, jeśli nie jest, bez dodatkowego widoku?
afrish

1
Nie działa to w układzie podobnym do siatki - nie ma pustej przestrzeni. Rozwiązanie Sherif elKhatib działa.
cdonner

119

Nie zmieniaj grawitacji LinearLayout na „prawo”, jeśli nie chcesz, aby wszystko było po prawej stronie.

Próbować:

  1. Zmień szerokość TextView nafill_parent
  2. Zmień grawitację TextView naright

Kod:

    <TextView 
              android:text="TextView" 
              android:id="@+id/textView1"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"   
              android:gravity="right">
    </TextView>

1
dzięki za to - to była szerokość fill_parent, która mnie wyrzucała
dldnh

2
Czy układ liniowy został w tym celu zaprojektowany? Czy nie należy po prostu użyć względnego układu, aby to osiągnąć? Czy to rozwiązanie nie jest włamaniem?
user2635088,

to nie zadziała, jeśli masz wiele kontrolek TextView w LinearLayout. Zobacz odpowiedź od @alcsan
Felix

To powinna być zaakceptowana odpowiedź. To podejście nie wykorzystuje żadnych dodatkowych widoków, a co ważniejsze, nie używa układu_waga, który znacznie zmniejsza wydajność.
Kazanie

android:layout_weight = "1"obok siebie android:gravity="right", powinien załatwić sprawę.
Vassilis

63

Jako dodatek do odpowiedzi alcsana możesz używać Spaceod API 14 (Android 4.0 ICE_CREAM_SANDWICH), udokumentuj tutaj .

Space to lekka podklasa View, która może być używana do tworzenia przerw między komponentami w układach ogólnego przeznaczenia.

<?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="match_parent" 
    android:orientation="horizontal" >

    <Space
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <TextView
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:text="TextView"
        android:gravity="right" />

</LinearLayout>

W przypadku aplikacji obsługujących poziomy API poniżej 14 dostępna jest android.support.v4.widget.Spacebiblioteka pomocy technicznej Android w wersji 22.1.0.


Ważne jest, że musisz ustawić layout_weight = "1"
code4j

Działa świetnie! Zachowuje szerokość każdego elementu.
phatmann

To działa. Wow, brzydota Androida nigdy nie przestaje mnie zadziwiać
Chris Neve

31

Z układem liniowym

<LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/select_car_book_tabbar"
        android:gravity="right" >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:src="@drawable/my_booking_icon" />
    </LinearLayout>

wprowadź opis zdjęcia tutaj

z FrameLayout

<FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/select_car_book_tabbar">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|right"
            android:src="@drawable/my_booking_icon" />
    </FrameLayout>

z RelativeLayout

<RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/select_car_book_tabbar">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerInParent="true"
            android:src="@drawable/my_booking_icon" />
    </RelativeLayout>

21

ustawienie widoków layout_weight="1"załatwi sprawę.!

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

<TextView
    android:id="@+id/textView1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

<RadioButton
    android:id="@+id/radioButton1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>


2
Takie proste rozwiązanie +1
Alex

1
Jeśli ktoś wciąż szuka, jest to właściwe rozwiązanie :)
passatgt

To jest magia! Jak się tego dowiedziałeś?
andreikashin

@ andreikashin, Zastanów się, czy to pomogło. Dzięki.
Saad Mahmud

13

Dodaj android:gravity="right"do LinearLayout. Zakładając, że TextViewmalayout_width="wrap_content"


2
W szczególności powiedział, aby wyrównać pojedynczy element w LinearLayout. Nie sam układ liniowy: sam układ jest ustawiony na fill_parent.
RichieHH,


4

Zrobiłem to w najprostszy sposób:

Wystarczy wziąć jeden RelativeLayout i umieścić w nim widok dziecka , który chcesz umieścić po prawej stronie.

    <LinearLayout
        android:id="@+id/llMain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#f5f4f4"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingBottom="20dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:paddingTop="20dp">

        <ImageView
            android:id="@+id/ivOne"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher" />


        <TextView
            android:id="@+id/txtOne"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="Hiren"
            android:textAppearance="@android:style/TextAppearance.Medium"
            android:textColor="@android:color/black" />

        <RelativeLayout
            android:id="@+id/rlRight"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="right">


            <ImageView
                android:id="@+id/ivRight"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:src="@drawable/ic_launcher" />

        </RelativeLayout>
    </LinearLayout>

Mam nadzieję, że ci to pomoże.


3

Powinieneś użyć RelativeLayout i przeciągnąć je, aż będzie dobrze :)

    <ImageView
        android:id="@+id/button_info"
        android:layout_width="30dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="10dp"
        android:contentDescription="@string/pizza"
        android:src="@drawable/header_info_button" />

</RelativeLayout>

2
„przeciągnij je” nie jest zalecane w przypadku ekranu o wielu rozdzielczościach
Moses Aprico

3

linear layoutza pomocą, layout_width="fill_parent"a także widżetu z tym samym layout width+ gravity as rightwyrównałby go do prawej.

Korzystam z 2 TextViews w poniższym przykładzie, topicTitlepo lewej i topicQuestionspo prawej stronie.

<?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="match_parent">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="20dp"
        android:orientation="horizontal">

    <TextView
        android:id="@+id/topicTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/topicQuestions"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:textSize="18sp"
        android:textStyle="bold" />
    </LinearLayout>

</RelativeLayout>

Wynik


2

Spróbuj zmienić layout_width na, android:layout_width="match_parent"ponieważ gravity:"right"wyrównuje tekst wewnątrz layout_width, a jeśli wybierzesz zawijanie treści, nie będzie ona miała dokąd pójść, ale jeśli wybierzesz element nadrzędny dopasowujący, może przejść w prawo.


2

Nie musisz używać żadnego dodatkowego widoku ani elementu:

// to takie proste i proste

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
>

// to pozostało wyrównanie

<TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="No. of Travellers"
      android:textColor="#000000"
      android:layout_weight="1"
      android:textStyle="bold"
      android:textAlignment="textStart"
      android:gravity="start" />

// to jest prawidłowe wyrównanie

<TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Done"
      android:textStyle="bold"
      android:textColor="@color/colorPrimary"
      android:layout_weight="1"
      android:textAlignment="textEnd"
      android:gravity="end" />

</LinearLayout>

0

W przypadku TextView:

<TextView 
    android:text="TextView" 
    android:id="@+id/textView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"   
    android:gravity="right"
    android:textAlignment="gravity">    
</TextView>

0

Dodawanie widoku jest nieco trudne i obejmuje całą szerokość ekranu w następujący sposób:

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<View
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_weight="1" />                

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

Spróbuj tego kodu:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Create Account"/>

</LinearLayout>

-1

Oto próbka. klucz do uzgodnienia jest następujący

android:layout_width="0dp"
android:layout_weight="1"

Pełny kod

<?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:padding="5dp">

    <TextView
        android:id="@+id/categoryName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="abcd" />

    <TextView
        android:id="@+id/spareName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="efgh" />

</LinearLayout>

wprowadź opis zdjęcia tutaj


-1

Użyj match_parent i grawitacji, aby ustawić tekst TextView w prawo, w następujący sposób:

<?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="match_parent"
    android:orientation="horizontal">

    <TextView android:text="TextView" android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="right">
    </TextView>

</LinearLayout>

-2

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_height="fill_parent" 
    android:orientation="horizontal" 
    android:gravity="right" >



    <TextView android:text="TextView" android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </TextView>

</LinearLayout>
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.