Выравнивание текстовых представлений по левому и правому краям в макете Android

158

Я начинаю с Android. У меня проблемы с получением простого макета.

Я хотел бы использовать LinearLayoutдля позиционирования два TextViewsв одном ряду. Один TextViewслева, другой справа (аналогично float: left, float: right в CSS).

Возможно ли это, или мне нужно использовать другую ViewGroupили дополнительную раскладку макета для этого?

Вот что у меня так далеко:

<?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>
Ричард
источник

Ответы:

290

Используйте RelativeLayoutс layout_alignParentLeftи 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>

Кроме того, вы, вероятно, должны использовать dip(или dp), а не spв макете . spотражают настройки текста, а также плотность экрана, поэтому они обычно используются только для определения размера текстовых элементов.

Дэйв Уэбб
источник
57
Чтобы предотвратить наложение содержимого, может также потребоваться добавить 'android: layout_toLeftOf = "@ + id / mytextview2" "в первое текстовое представление
Rollin_s
Для динамических таблиц вы можете сделать: TableRow.LayoutParams col1Params = new TableRow.LayoutParams (); // Завершение содержимого строки col1Params.height = LayoutParams.WRAP_CONTENT; col1Params.width = LayoutParams.WRAP_CONTENT; // Устанавливаем гравитацию в центр тяжести столбца col1Params.gravity = Gravity.LEFT;
Сиддхусинг
3
Для лучшей совместимости и поддержки различных экранов устройства используйте «android: layout_alignParentEnd =" true "" (при использовании layout_alignParentRight) и "android: layout_alignParentStart =" true "" (при использовании layout_alignParentLeft).
августа
@Rollin_s, я люблю тебя.
Вегас
89

Вы можете использовать свойство gravity, чтобы «плавать» представления.

<?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
источник
1
К сожалению, кажется, что это не приводит к тому, что оба элемента находятся в одной строке
Webnet
1
Разве гравитация не влияет только на «выравнивание текста»?
Джошуа Пинтер
3
извините, это работает. Я забыл добавить Android: layout_weight = "1". После добавления это нормально.
Абдулла Умер
13

Это можно сделать с помощью LinearLayout(меньше накладных расходов и больше контроля, чем у параметра Relative Layout). Дайте второму виду оставшееся пространство, чтобы gravityможно было работать. Проверено на API 16.

доказательство

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

Если вы хотите ограничить размер первого текстового представления, сделайте это:

Отрегулируйте веса по мере необходимости. Относительная компоновка не позволит вам установить процентный вес, как этот, только фиксированный дп одного из представлений

Доказательство 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>
Карсон Хольцгеймер
источник
8

Даже с советами Rollin_s ответ Дэйва Уэбба не сработал для меня. Текст справа TextViewвсе еще перекрывал текст слева TextView.

В конце концов я получил то поведение, которое хотел, примерно так:

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

Обратите внимание, что mytextview2 "android:layout_width"установлен как "match_parent".

Надеюсь, это поможет кому-то!

pumpkinpie65
источник
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" />

Тадж Мб
источник
1

В случае, если вы хотите, чтобы левый и правый элементы переносили содержимое, но имели средний пробел

<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
источник
0

Есть много других способов сделать это, я бы сделал что-то подобное.

<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
источник
0

Ответ Дэйва Уэбба сработал для меня. Спасибо! Вот мой код, надеюсь, это кому-нибудь поможет!

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

Изображение: Изображение

GinCanhViet
источник
0

введите описание изображения здесь

Этот Кодекс Разделит контроль на две равные стороны.

    <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>
Сказал Мухаммед Идриес
источник