Wyrównanie widoków tekstu na lewej i prawej krawędzi w układzie Androida

158

Rozpoczynam korzystanie z Androida. Mam problem z uruchomieniem prostego układu.

Chciałbym użyć a, LinearLayoutaby ustawić dwa TextViewsw jednym rzędzie. Jeden TextViewpo lewej stronie, drugi po prawej stronie (analogicznie do float: po lewej, float: po prawej w CSS).

Czy to możliwe, czy też muszę użyć innego ViewGrouplub dalszego zagnieżdżania układu, aby to osiągnąć?

Oto, co mam do tej pory:

<?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
źródło

Odpowiedzi:

290

Użyj RelativeLayoutz layout_alignParentLefti 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>

Ponadto prawdopodobnie powinieneś używać dip(lub dp) zamiast spw swoim układzie . spodzwierciedlają ustawienia tekstu, a także gęstość ekranu, więc zwykle służą tylko do określania rozmiaru elementów tekstowych.

Dave Webb
źródło
57
Aby zapobiec nakładaniu się treści, możesz również dodać „android: layout_toLeftOf =" @ + id / mytextview2 "'do pierwszego
widoku tekstu
W przypadku tabel dynamicznych możesz wykonać: TableRow.LayoutParams col1Params = new TableRow.LayoutParams (); // Zwiń zawartość wiersza col1Params.height = LayoutParams.WRAP_CONTENT; col1Params.width = LayoutParams.WRAP_CONTENT; // Ustaw grawitację, aby wyśrodkować grawitację kolumny col1Params.gravity = Gravity.LEFT;
siddhusingh
3
Aby uzyskać lepszą kompatybilność i obsługę różnych ekranów urządzeń, użyj „android: layout_alignParentEnd =" true "" (w przypadku korzystania z layout_alignParentRight) i "android: layout_alignParentStart =" true "" (w przypadku korzystania z layout_alignParentLeft).
ivanleoncz
@Rollin_s, kocham cię.
Vegas
89

Możesz użyć właściwości grawitacji, aby „przesuwać” widoki.

<?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
źródło
1
Niestety wydaje się, że nie powoduje to, że oba elementy są na tej samej linii
Webnet
1
Czy grawitacja nie wpływa tylko na „wyrównanie tekstu”?
Joshua Pinter
3
przepraszam, działa. Zapomniałem dodać android: layout_weight = "1". Po dodaniu, że wszystko w porządku.
Abdullah Umer
13

Można to zrobić z LinearLayout(mniejszym narzutem i większą kontrolą niż opcja Relative Layout). Podaj drugi widok pozostałej przestrzeni, aby gravitymogła działać. Przetestowano ponownie do API 16.

Dowód

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

Jeśli chcesz ograniczyć rozmiar pierwszego widoku tekstu, zrób to:

W razie potrzeby wyreguluj ciężary. Względny układ nie pozwala na ustawienie takiej wagi procentowej, tylko stałą wartość dp jednego z widoków

Dowód 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
źródło
8

Nawet przy wskazówce Rollina, odpowiedź Dave'a Webba nie zadziałała dla mnie. Tekst po prawej stronie TextViewnadal zachodził na tekst po lewej TextView.

W końcu uzyskałem zachowanie, które chciałem, po czymś takim:

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

Zauważ, że mytextview2 został "android:layout_width"ustawiony jako "match_parent".

Mam nadzieję, że to komuś pomoże!

pumpkinpie65
źródło
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
źródło
1

W przypadku, gdy chcesz, aby lewy i prawy element zawijały zawartość, ale miały środkową przestrzeń

<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
źródło
0

Jest na to wiele innych sposobów, zrobiłbym coś takiego.

<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
źródło
0

Odpowiedź Dave'a Webba zadziałała dla mnie. Dzięki! Oto mój kod, mam nadzieję, że to komuś pomoże!

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

Obraz: Obraz

GinCanhViet
źródło
0

wprowadź opis obrazu tutaj

Ten kod podzieli kontrolę na dwie równe strony.

    <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
źródło