it-swarm-pt.tech

Centralizar vários itens em um RelativeLayout sem colocá-los em um contêiner?

Eu tenho um RelativeLayout que contém um par de botões lado a lado, que quero centralizar no layout. Eu poderia simplesmente colocar os botões em um LinearLayout e centralizá-lo no RelativeLayout, mas quero manter meu xml o mais limpo possível.

Aqui está o que eu tentei, isso apenas coloca o botão "aplicar" no centro e o botão "desfazer" à esquerda:

<RelativeLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="15sp">
  <TextView
    Android:id="@+id/instructions"
    Android:text="@string/instructions"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="15sp"
    Android:layout_centerHorizontal="true"
    />
  <Button
    Android:id="@+id/apply"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerInParent="true"
    Android:text="@string/apply"
    Android:textSize="20sp"
    Android:layout_below="@id/instructions"
    />
  <Button
    Android:id="@+id/undo"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerInParent="true"
    Android:text="@string/undo"
    Android:textSize="20sp"
    Android:layout_toLeftOf="@id/apply"
    Android:layout_below="@id/instructions"
    />
</RelativeLayout>
38
herpderp

Android:gravity alinhará o conteúdo dentro de view ou layout em que é usado.

Android:layout_gravity alinhará view ou layout dentro de seu pai.

Então adicionando

Android:gravity="center"

para o seu RelativeLayout deve fazer o truque ...

Como isso:

<RelativeLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:gravity="center"
    Android:layout_marginTop="15sp">

</RelativeLayout>
62
BrainCrash

Aqui está uma extensão da resposta do BrainCrash. É uma opção não aninhada que agrupa e centraliza os três na horizontal e na vertical. Além disso, ele pega o TextView superior e o centraliza horizontalmente nos dois botões. Se desejar, você pode centralizar o texto no TextView com Android: gravity = "center". Também removi as margens, adicionei cor e defina a altura do RelativeLayout como fill_parent para destacar o layout. Testado na API 11.

<RelativeLayout
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:gravity="center"
  Android:background="@Android:color/black"
  >
  <TextView
    Android:id="@+id/instructions"
    Android:text="TEST"
    Android:textSize="20sp"
    Android:background="@Android:color/darker_gray"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerHorizontal="true"
    Android:layout_alignLeft="@+id/undo"
    Android:layout_alignRight="@+id/apply"
    Android:gravity="center"
    />
  <Button
    Android:id="@+id/apply"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerInParent="true"
    Android:text="APPLY"
    Android:textSize="20sp"
    Android:layout_below="@id/instructions"
    />
  <Button
    Android:id="@+id/undo"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerInParent="true"
    Android:text="UNDO"
    Android:textSize="20sp"
    Android:layout_toLeftOf="@id/apply"
    Android:layout_below="@id/instructions"
    />
</RelativeLayout>
9
mindriot
Android:layout_gravity="center"

quase dará o que você está procurando.

5
triggs

Aqui está uma combinação das respostas acima que resolveram minha situação específica:

Centralizando duas etiquetas separadas em um layout que também inclui um botão na posição mais à esquerda do mesmo layout (botão, etiqueta, etiqueta, da esquerda para a direita, onde as etiquetas estão centralizadas em relação ao layout que contém as três visualizações - ou seja, o botão não empurra as etiquetas para fora do centro).

Eu resolvi isso aninhando dois RelativeLayout, onde o layout mais externo incluía o Button e um Inner-RelativeLayout.

O Inner-RelativeLayout continha os dois rótulos de texto (TextView).

Aqui está um trecho que fornece os detalhes de como a centralização e outras coisas de layout foram feitas:

consulte: RelativeLayout Gravity não aplicado? e Gravity e layout_gravity no Android para saber as diferenças entre gravidade e layout_gravity.

Ajuste o paddingLeft no botão btn_button1 para ver que o TextView não se move.

(Peço desculpas por ter xz pelos votos negativos. Fiquei muito apressado em pensar que apenas porque suas sugestões não resolveram a pergunta exata que estava sendo feita, que elas ajudam a resolver situações muito semelhantes (a resposta aqui resolve uma situação muito específica , e apenas a combinação de todas essas respostas resolveu meu problema. Tentei fazer uma votação, mas isso não me permitirá a menos que edite as respostas, o que não quero fazer.)

<RelativeLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:id="@+id/rl_outer"
  Android:layout_width="fill_parent"
  Android:layout_height="50dip"
  Android:background="#FF0000FF">

  <Button
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/btn_button1"
    Android:layout_width="wrap_content"
    Android:layout_height="fill_parent"
    Android:background="#FF00FF00"
    Android:text="&lt;"
    Android:textSize="20sp"
    Android:paddingLeft="40dip"/>

  <RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/rl_inner"
    Android:layout_width="wrap_content"
    Android:layout_height="fill_parent"
    Android:background="#FFFF00FF"        
    Android:layout_centerInParent="true"
    Android:gravity="center">      

    <TextView
      xmlns:Android="http://schemas.Android.com/apk/res/Android"
      Android:id="@+id/tv_text1"
      Android:layout_width="wrap_content"
      Android:layout_height="fill_parent"
      Android:background="#FF505050"
      Android:textSize="20sp"
      Android:textColor="#FFFFFFFF"
      Android:text="Complaint #"
      Android:gravity="center"/>     

    <TextView
      xmlns:Android="http://schemas.Android.com/apk/res/Android"
      Android:id="@+id/tv_text2"
      Android:layout_width="wrap_content"
      Android:layout_height="fill_parent"
      Android:background="#FF505050"
      Android:textSize="20sp"
      Android:textColor="#FFFFFFFF"
      Android:layout_toRightOf="@id/tv_text1"
      Android:gravity="center"/>

  </RelativeLayout>
</RelativeLayout>
4
samis

LinearLayout é uma boa opção. Fora isso, existem opções como criar uma vista invisível e centralizar e, em seguida, alinhar o botão esquerdo para a esquerda e direita à direita. Mas esses são apenas soluções alternativas.

2
havexz