Botão Alinhar à direita na horizontal LinearLayout

130

Se você olhar para a imagem anexada. Preciso que meu botão esteja alinhado à direita, mas por algum motivo não está funcionando com 'gravidade: certo' ...

Cancelar Adicionar

Aqui está o meu código para esse 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>

Por que não está funcionando ?!

ROMANIA_engineer
fonte
6
Experimente o layout relativo neste caso. O LL não funcionará,
AAnkit
4
Se você deseja usar o LinearLayout, use dois layouts lineares internos e use layout_weight junto com layout_gravity. Vai funcionar bem.
Vamsi Challa
@VamsiChalla é possível com um, verifique minha nova resposta abaixo.
TWIStErRob 23/03

Respostas:

137

Use o código abaixo para isso

<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
fonte
3
Parece que o atributo 'layout_alignParentRight' não está disponível para o botão neste caso? Preterido, talvez?
20
ru usando relativelayout em vez de linearlayout?
Dipak Keshariya
1
Ah merda .. Desculpe por isso, eu olhei completamente além disso. Obrigado!
4
Ainda me surpreende como algo que parece tão fácil se torna tão difícil ao tentar usar um esquema linear.
AlvaroSantisteban
2
@DipakKeshariya para futuros espectadores, você pode usar o "android: layout_gravity =" top | right "linearlayout
SupimpaAllTheWay
145

LinearLayoutSolução única . Apenas adicionando uma visualização de espaçamento simples:
(Ninguém parecia ter mencionado essa, apenas soluções de vários layouts mais complicadas.)

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

Observe a visualização "destacada", não modifiquei mais nada. Altura = 0 garante que não seja visível. Largura = 0 é porque a largura é determinada pelo LinearLayoutpeso = 1. Isso significa que a vista do espaçador se estenderá o máximo possível na direção (orientação) do LinearLayout.

Observe que você deve usar android.widget.Spaceou, em android.support.v4.widget.Spacevez de,View se o seu nível de API e / ou dependências permitirem. Spaceconsegue o trabalho de maneira mais barata, porque apenas mede e não tenta desenhar nada do que Viewfaz; também é mais expressivo transmitir a intenção.

TWiStErRob
fonte
2
Basta adicionar android: layout_weight = "1" ao R.id.lblExpenseCancel e isso é tudo.
Hrules6872
1
@h_rules que funciona se você deseja invadir, mas imagine o que acontece quando você adiciona um plano de fundo ao TextView.
TWIStErRob
2
Eu me pergunto por que essa resposta foi negativa, funciona e é legal, vou tentar definitivamente.
Elvedin Hamzagic
Que é perfeito como um desenvolvedor móvel
Shivanand Darur
Se você adicionar um espaçador, em diferentes tamanhos de tela, você terá resultados diferentes. Portanto, não é a solução ideal.
GeoMint 11/09/16
29

Solução real para o caso:

android:layout_weight="1" para TextView, e seu botão se move para a direita!

nicolas asinovich
fonte
28

Sei que esta pergunta foi feita há algum tempo, mas já fiz isso antes e permite mais controle ao alinhar itens. Você acabou de aninhar outro LinearLayoutque conterá seu botão dentro dele. Você pode alterar a gravidade do layout do botão e fazê-lo ir para a direita enquanto o botão TextViewainda estiver à esquerda.

Tente este código:

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

Pode ser necessário brincar com o preenchimento no layout aninhado para que ele atue como você deseja.

BobbyD17
fonte
2
Você deve usar um FrameLayout para seu layout aninhado. Para posicionar um único elemento, é para isso. Além disso, dê um peso para que ele preencha a parte correta do pai. +1 por não usar o Layout relativo de qualquer maneira.
Hjalmar
10

tente este

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

Como mencionado algumas vezes antes: Para alternar de LinearLayout para RelativeLayout funciona, mas você também pode resolver o problema em vez de evitá-lo. Use as ferramentas fornecidas pelo LinearLayout: Dê ao TextView um peso = 1 (veja o código abaixo), o peso do seu botão deve permanecer 0 ou nenhum. Nesse caso, o TextView ocupará todo o espaço restante, que não é usado para exibir o conteúdo do seu TextView ou ButtonView e pressiona o botão para a direita.

<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>
Barb
fonte
2
Esta é a melhor resposta. Eu só queria escrever algo parecido até encontrar sua postagem.
codingdave
Isso é muito melhor do que a mudança para RelativeLayoutDevido a problemas de memória, já que os RelativeLayoutconsome muito mais memória do queLinearLayout
ThunderWiring
7

Você precisa adicionar gravidade ao layout e não ao botão; a gravidade nas configurações do botão é para Texto dentro do botão

<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
fonte
2
Isso não alinharia o TextView também? Eu só preciso do botão alinhado à direita ...
1
Se você precisar alinhar apenas o botão, use RelativeLayout.
goodm
1
Mesmo se você quiser alinhar todos os botões, isso não funcionará (API 16). As visualizações de crianças ainda estão alinhadas à esquerda.
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>

Isto irá resolver o seu problema

Anand S Joshi
fonte
3

Se você não quiser ou não puder usar o RelativeLayout, poderá quebrar o botão em um LinearLayout com orientação "vertical" e largura "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> 

Isso ocorre porque, se a orientação do LinearLayout for horizontal, a gravidade afetará apenas as vistas verticalmente. E se a orientação for 'vertical', a gravidade afetará apenas as vistas horizontalmente. Veja aqui para mais detalhes sobre a explicação da orientação / gravidade do LinearLayout.

Stephanie Gu
fonte
2

Basta adicionar android: gravity = "right" neste layout pai da linha, isso funcionará.

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

Eu usei um layout semelhante com 4 TextViews. Dois TextViews devem estar alinhados à esquerda e dois TextViews devem estar alinhados à direita. Então, aqui está a minha solução, se você quiser usar LinearLayoutssozinho.

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

Você pode usar RelativeLayout ou definir gravity = "right" no layout pai do seu botão.

HuynhHan
fonte
0

Eu sei que isso é antigo, mas aqui está outro em um Layout Linear:

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

Observe o layout_gravity em vez de apenas a gravidade.

Juanjo
fonte
O que há com isso center_vertical|bottom|top? Eles parecem gravidades de alinhamento exclusivas para mim.
TWIStErRob 11/09/16
0

Você deve usar o Relativelayout em vez de Linearlayout como layout principal. Se você usar o Relativelayout como principal, manipule facilmente o botão no lado direito, porque o layout relativo nos fornece alinharParent direito, esquerdo, superior e inferior.

Farhan Ghaffar
fonte
-2

Use a largura do layout no botão como o android: layout_width = "75dp"

Excluído por negatividade
fonte