Alinhando visualizações de texto nas bordas esquerda e direita no layout do Android

158

Estou começando com o Android. Estou tendo problemas para obter um layout simples.

Eu gostaria de usar a LinearLayoutpara posicionar dois TextViewsem uma única linha. Um TextViewno lado esquerdo e o outro no lado direito (análogo a float: left, float: right em CSS).

Isso é possível ou preciso usar um ViewGroupaninhamento de layout diferente ou adicional para realizá-lo?

Aqui está o que eu tenho até agora:

<?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:padding="10sp">
<TextView android:id="@+id/mytextview1" android:layout_height="wrap_content" android:text="somestringontheleftSomestring" android:layout_width="wrap_content"/>
<TextView android:id="@+id/mytextview2" android:layout_height="wrap_content" android:ellipsize="end"
    android:text="somestringontheright" android:layout_width="wrap_content"/>
</LinearLayout>
Richard
fonte

Respostas:

290

Use a RelativeLayoutcom layout_alignParentLefte layout_alignParentRight:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout01" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:padding="10dp">

    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true" 
        android:id="@+id/mytextview1"/>

    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentRight="true" 
        android:id="@+id/mytextview2"/>

</RelativeLayout>

Além disso, você provavelmente deveria estar usando dip(oudp ) em vez de spno seu layout . sprefletem as configurações de texto e a densidade da tela, de modo que geralmente são apenas para dimensionar itens de texto.

Dave Webb
fonte
57
Para impedir que o conteúdo da sobreposição, também pode querer adicionar 'android: layout_toLeftOf = '@ + id / mytextview2'' para o primeiro textview
Rollin_s
Para tabelas dinâmicas, você pode: TableRow.LayoutParams col1Params = new TableRow.LayoutParams (); // Agrupe o conteúdo da linha col1Params.height = LayoutParams.WRAP_CONTENT; col1Params.width = LayoutParams.WRAP_CONTENT; // Defina a gravidade para centralizar a gravidade da coluna col1Params.gravity = Gravity.LEFT;
precisa saber é o seguinte
3
Para melhor compatibilidade e suporte para diferentes telas de dispositivos, use "android: layout_alignParentEnd =" true "" (ao usar layout_alignParentRight) e "android: layout_alignParentStart =" true "" (ao usar layout_alignParentLeft).
precisa saber é o seguinte
@Rollin_s, eu te amo.
Vegas
89

Você pode usar a propriedade gravidade para "flutuar" visualizações.

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

    <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="center_vertical|center_horizontal"
            android:orientation="horizontal">

        <TextView  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:gravity="left"
            android:layout_weight="1"
            android:text="Left Aligned"
            />

        <TextView  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:gravity="right"
            android:layout_weight="1"
            android:text="Right Aligned"
            />
    </LinearLayout>

</LinearLayout>
JeremyFromEarth
fonte
1
Infelizmente, parece que isso não causar ambos os itens a ser na mesma linha
Webnet
1
A gravidade não afeta apenas o "alinhamento do texto"?
Joshua Pinter
3
desculpe, está funcionando. Eu tinha esquecido de adicionar o android: layout_weight = "1". Depois de adicionar que está tudo bem.
Abdullah Umer
13

Isso pode ser feito com LinearLayout(menos sobrecarga e mais controle do que a opção Layout relativo). Dê à segunda visualização o espaço restante para que gravitypossa funcionar. Testado de volta à API 16.

Prova

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Aligned left" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="end"
        android:text="Aligned right" />
</LinearLayout> 

Se você deseja limitar o tamanho da primeira exibição de texto, faça o seguinte:

Ajuste os pesos conforme necessário. O layout relativo não permitirá que você defina uma porcentagem de peso como esta, apenas um dp fixo de uma das visualizações

Prova 2

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

    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Aligned left but too long and would squash the other view" />

    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:gravity="end"
        android:text="Aligned right" />
</LinearLayout>
Carson Holzheimer
fonte
8

Mesmo com a dica de Rollin, a resposta de Dave Webb não funcionou para mim. O texto à direitaTextView ainda estava sobreposto ao texto à esquerdaTextView .

Acabei conseguindo o comportamento que queria com algo assim:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout01" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:padding="10dp">

<TextView 
    android:id="@+id/mytextview1"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true" />

<TextView 
    android:id="@+id/mytextview2"
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@id/mytextview1"
    android:gravity="right"/>

</RelativeLayout>

Observe que mytextview2 foi "android:layout_width"definido como"match_parent" .

Espero que isso ajude alguém!

pumpkinpie65
fonte
4

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Hello world" />

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

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Gud bye" />

Taj Mb
fonte
1

Caso você queira que os elementos esquerdo e direito agrupem o conteúdo, mas tenham o espaço do meio

<LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    <Space
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</LinearLayout>
funct7
fonte
0

Existem muitas outras maneiras de conseguir isso, eu faria algo assim.

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

    <TextView
        android:id="@+id/textRight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginTop="30dp"
        android:text="YOUR TEXT ON THE RIGHT"
        android:textSize="16sp"
        android:textStyle="italic" />


    <TextView
        android:id="@+id/textLeft"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="30dp"
        android:text="YOUR TEXT ON THE LEFT"
        android:textSize="16sp" />
</RelativeLayout>
NelsonRoberts
fonte
0

A resposta de Dave Webb funcionou para mim. Obrigado! Aqui meu código, espero que isso ajude alguém!

<RelativeLayout
    android:background="#FFFFFF"
    android:layout_width="match_parent"
    android:minHeight="30dp"
    android:layout_height="wrap_content">
    <TextView
        android:height="25dp"
        android:layout_width="wrap_content"
        android:layout_marginLeft="20dp"
        android:text="ABA Type"
        android:padding="3dip"
        android:layout_gravity="center_vertical"
        android:gravity="left|center_vertical"
        android:layout_height="match_parent" />
    <TextView
        android:background="@color/blue"
        android:minWidth="30px"
        android:minHeight="30px"
        android:layout_column="1"
        android:id="@+id/txtABAType"
        android:singleLine="false"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="20dp"
        android:layout_width="wrap_content" />
</RelativeLayout>

Imagem: Imagem

GinCanhViet
fonte
0

insira a descrição da imagem aqui

Este código dividirá o controle em dois lados iguais.

    <LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/linearLayout">
    <TextView
        android:text = "Left Side"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight = "1"
        android:id = "@+id/txtLeft"/>

    <TextView android:text = "Right Side"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight = "1"
        android:id = "@+id/txtRight"/>
    </LinearLayout>
Sayed Muhammad Idrees
fonte