Como alinhar o widget à direita no layout linear horizontal do Android?

206

Este é o código que estou usando e não está funcionando:

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

Respostas:

419

Tente adicionar o elemento Viewhorizontal vazio LinearLayoutantes do elemento que você deseja ver à direita, por exemplo:

<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>
alcsan
fonte
12
Isso funciona! Mas qualquer um pode explicar o porquê? Eu não conseguia entender totalmente.
GMsoF
29
O Empty View está tentando ocupar a quantidade máxima de espaço, deixando espaço para o botão.
alcsan
14
Até agora, essa foi a única coisa que funcionou para mim na tentativa de ter alguns botões à esquerda e um botão final à direita. Mas parece um hack para mim. Existe uma maneira "certa" de fazer isso?
IcedDante
8
Isso é incrível! Mas por que gravidade = "certo" não funciona dessa maneira desde o início? Por que ele precisa de ajuda com essa outra visão? E como está "certo", se não estiver, sem a visão extra?
afrish
1
Isso não funciona em um layout semelhante a uma grade - não há espaço vazio. A solução de Sherif elKhatib funciona.
Cdonner 23/10/2015
119

Não altere a gravidade do LinearLayout para "right" se não quiser que tudo esteja à direita.

Experimentar:

  1. Altere a largura do TextView parafill_parent
  2. Altere a gravidade do TextView pararight

Código:

    <TextView 
              android:text="TextView" 
              android:id="@+id/textView1"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"   
              android:gravity="right">
    </TextView>
Sherif elKhatib
fonte
1
obrigado por isso - que era a largura do fill_parent que estava me jogando fora
dldnh
2
O layout linear foi projetado para isso? Não se deve apenas usar o layout relativo para conseguir isso? Esta solução não é um hack?
user2635088
isso não funcionará se você tiver vários controles TextView em um LinearLayout. Veja a resposta de @alcsan
Felix
Essa deve ser a resposta aceita. Essa abordagem não usa visualizações adicionais e, mais importante, não usa layout_weight que mostra consideravelmente o desempenho baixo.
Sermilion
android:layout_weight = "1"lado a lado com android:gravity="right", deve fazer o truque.
Vassilis
63

Como complemento à resposta da alcsan, você pode usar Spacedesde a API 14 (Android 4.0 ICE_CREAM_SANDWICH), documento aqui .

O espaço é uma subclasse leve da View que pode ser usada para criar intervalos entre componentes nos layouts de uso geral.

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

Para aplicativos que android.support.v4.widget.Spaceoferecem suporte a níveis de API menores de 14 anos, existe uma desde a Biblioteca de suporte Android r22.1.0.

Final de semana
fonte
Importante é que você precisa definir layout_weight = "1"
code4j 7/17/17
Funciona perfeitamente! Preserva a largura de cada elemento.
Phatmann
Isso funciona. Uau, a feiúra do Android nunca deixa de me surpreender
Chris Neve
31

Com layout linear

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

insira a descrição da imagem aqui

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

com 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>
DeltaCap019
fonte
21

definir a visualização layout_weight="1"faria o truque.!

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

Saad Mahmud
fonte
2
Uma solução tão simples +1
Alex
1
Se alguém ainda está à procura, esta é a solução certa :)
passatgt
Isto é mágico! Como você descobriu isso?
18719 Andreikashin
@andreikashin, considere uma votação se ajudou. Obrigado.
Saad Mahmud
13

Adicione android:gravity="right"ao LinearLayout. Assumindo que o TextViewpossuilayout_width="wrap_content"

Ronnie
fonte
2
Ele disse especificamente para alinhar um único componente dentro do LinearLayout. Não é o layout linear em si: o layout em si é definido como fill_parent.
RichieHH
8

basta adicionar android:gravity="right"no seu layout de liner.

Idrees Ashraf
fonte
4

Eu fiz isso da maneira mais fácil:

Basta pegar um RelativeLayout e colocar a visão do seu filho nela, que você deseja colocar à direita lado .

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

Espero que ajude você.

Hiren Patel
fonte
3

Você deve usar um RelativeLayout e apenas arrastá-los até que pareça bom :)

    <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>
detman
fonte
2
"arraste-os" não recomendado para tela de alta resolução
Moses Aprico 22/10
3

linear layoutcom layout_width="fill_parent"e também o widget com o mesmo layout width+gravity as right o alinharia à direita.

Estou usando 2 TextViews no exemplo a seguir, topicTitleà esquerda e topicQuestionsà direita.

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

Resultado

prayagupd
fonte
2

Tente alterar a layout_width para android:layout_width="match_parent"porque gravity:"right"alinha o texto dentro da layout_width e, se você escolher o conteúdo de quebra automática, ele não terá para onde ir, mas se você escolher combinar pai, poderá ir para a direita.

Mrvinent
fonte
2

Não é necessário usar nenhuma visualização ou elemento extra:

// isso é tão fácil e simples

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

// isso é alinhamento esquerdo

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

// este é o alinhamento correto

<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>
kamaljeet Singh
fonte
0

No caso do 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>
Роман Елизаров
fonte
0

A adição de visualizações é um pouco difícil e abrange toda a largura da tela, assim:

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

Tente este código:

<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>
Zafar Iqbal
fonte
-1

Aqui está uma amostra. a chave para organizar é a seguinte

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

Código completo

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

insira a descrição da imagem aqui

Rohit Mandiwal
fonte
-1

Use match_parent e gravity para definir o texto do TextView para a direita, assim:

<?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>
Guillermo Gonzalez
fonte
-2

Tente isso ..

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