Як зробити так, щоб макет за допомогою View заповнив залишок місця?


188

Я розробляю інтерфейс моєї програми. Мені потрібен макет виглядає так:

Приклад потрібного макета

(<і> - кнопки). Проблема полягає в тому, що я не знаю, як переконатися, що TextView заповнить залишок місця, а дві кнопки мають фіксований розмір.

Якщо я використовую fill_parent для перегляду тексту, друга кнопка (>) не може бути показана.

Як я можу створити макет, схожий на зображення?


що ви використовуєте як макет кореня?
Вудши

1
@woodshy Будь-яка макет в порядку, це не має значення.
Люк Во

Відповіді:


213

Відповідь від Woodshy працювала на мене, і вона простіша за відповідь Унгуряну Лівіу, оскільки вона не використовує RelativeLayout. Я надаю свій макет для наочності:

<LinearLayout 
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:orientation="horizontal"
      >

     <Button
        android:layout_width = "80dp"
        android:layout_weight = "0"
        android:layout_height = "wrap_content"
        android:text="&lt;"/>
     <TextView
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_weight = "1"/>
     <Button
        android:layout_width = "80dp"
        android:layout_weight = "0"
        android:layout_height = "wrap_content"
        android:text="&gt;"/>   
 </LinearLayout>

Є такі речі, як alignLeftі alignParentLeftт. Д., Яких ніколи не можна досягти LinearLayout.
IcyFlame

Я не повністю розумію, як це можливо, але це дуже цікавий трюк, щоб уникнути RelativeLayout
a.dibacco

2
Як це може бути прийнятою відповіддю? Перегляду зображень немає, це лише частина рішення. Принаймні, це краще, ніж старий голосовий відповідь з відносною схемою (я пояснив, чому у своїй відповіді)
Лівіо

геніальне рішення
Мохаммед Ельсайд

92

У випадку, якщо <TEXT VIEW> розміщено в LinearLayout, встановіть властивість Layout_weight з <і> на 0 і 1 для TextView.
У разі RelativeLayout вирівняйте <і> вліво і вправо і встановіть властивість "Макет ліворуч" та "Макет праворуч" TextView до ідентифікаторів <і>


Хтось ще потребує зразка?
Вудши

Як додати зображення в цей макет, щоб заповнити весь вигляд
Тушар Пандей

як ви додасте зображення всередині відносного макета, щоб заповнити весь вигляд
Тушар Пандей

4
@woodshy так, зразок все ще буде корисним
Френк Швітерман,

Подивіться на приклад
MyDogTom

71

Якщо ви використовуєте RelativeLayout, ви можете зробити це приблизно так:

<RelativeLayout
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent">
    <ImageView
        android:id = "@+id/my_image"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_alignParentTop ="true" />
    <RelativeLayout
        android:id="@+id/layout_bottom"
        android:layout_width="fill_parent"
        android:layout_height = "50dp"
        android:layout_alignParentBottom = "true">
        <Button
            android:id = "@+id/but_left"
            android:layout_width = "80dp"
            android:layout_height = "wrap_content"
            android:text="&lt;"
            android:layout_alignParentLeft = "true"/>
        <TextView
            android:layout_width = "fill_parent"
            android:layout_height = "wrap_content"
            android:layout_toLeftOf = "@+id/but_right"
            android:layout_toRightOf = "@id/but_left" />
        <Button
            android:id = "@id/but_right"
            android:layout_width = "80dp"
            android:layout_height = "wrap_content"
            android:text="&gt;"
            android:layout_alignParentRight = "true"/>
    </RelativeLayout>
</RelativeLayout>

Дякую, це працює :) Але я не розумію. Чому TextView не заповнює весь простір, не для >кнопки?
Люк Во

2
Чому дві вкладені відносні схеми? Корінного має бути достатньо. Тоді, все, що вам потрібно зробити, - це забезпечити, щоб діти нижнього відносного макета вирівнялисяParentBottom = "вірно"
Ноель

@Noel Ви маєте рацію. Я вибираю 2 верстки, тому що саме так я звик: у моїх програмах може статися так, що мені потрібно змінити видимість кількох переглядів, і простіше розмістити їх у макеті та змінити видимість саме для цього макета . Мій приклад не є досконалим, але він працює, і це може бути корисним для когось.
Ungureanu Liviu

1
@ WN Це теж для мене сцена :) Я думаю, що у текстовому перегляді використовується не весь простір, оскільки права кнопка має фіксовану ширину. Якщо ви зміните android: layout_width = "80dp" на android: layout_width = "wrap_content" для правої кнопки, вона могла б працювати.
Ungureanu Liviu

2
Ця відповідь справді погана! Ви повинні уникати розміщення 2 відносних макетів, оскільки відносний макет завжди робить 2 проходи для малювання (проти 1 для будь-якого іншого типу макета). Це стає експоненціальним, коли ви гніздите їх. Ви повинні використовувати лінійний макет із шириною = 0 і вагою = 1 на елементі, який ви хочете заповнити зліва. Пам'ятайте: використовуйте відносний макет ТІЛЬКИ, коли у вас немає іншого вибору. stackoverflow.com/questions/4069037/…
Лівіо

30

Використовуючи a ConstraintLayout, я знайшов щось подібне

<Button
    android:id="@+id/left_button"
    android:layout_width="80dp"
    android:layout_height="48dp"
    android:text="&lt;"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toRightOf="@+id/left_button"
    app:layout_constraintRight_toLeftOf="@+id/right_button"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/right_button"
    android:layout_width="80dp"
    android:layout_height="48dp"
    android:text="&gt;"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

працює. Ключ - правильно встановити обмеження правого, лівого, верхнього та нижнього краю, потім встановити ширину та висоту 0dpта дати зрозуміти, що це власний розмір.


4
Тільки починаючи використовувати ConstraintLayout, його чудово знати, що ширину та висоту можна визначити обмеженнями при встановленні їх на "0", за це
дякуємо

Важливо бути обережним щодо напрямку стрілки кожного обмеження. Переконайтеся, що він TextViewмає ліві та праві обмеження. TextViewЧи не розтягується , якщо перший Buttonмає праве обмеження до , TextViewа останній Buttonмає ліве обмеження до TextView.
Мануель

набагато краще! покращує продуктивність, не маючи вкладених макетів. Дякуємо, що нагадали нам про трюк
0dp

7

Ви просто встановлюєте minWidth або minHeight, залежно від того, що шукаєте, горизонтального чи вертикального. А для іншого об'єкта (того, яким ви хочете заповнити залишився простір) ви встановите вагу 1 (встановіть ширину, щоб обернути його вміст), тож він заповнить решту площі.

<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center|left"
        android:orientation="vertical" >
</LinearLayout>
<LinearLayout
        android:layout_width="80dp"
        android:layout_height="fill_parent"
        android:minWidth="80dp" >
</LinearLayout>

4

ви можете використовувати атрибут високої версії layout. Нижче ви можете побачити макет, де ListView займає весь вільний простір з кнопками внизу:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".ConfigurationActivity"
    android:orientation="vertical"
    >

        <ListView
            android:id="@+id/listView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1000"
            />


        <Button
            android:id="@+id/btnCreateNewRule"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Create New Rule" />



        <Button
            android:id="@+id/btnConfigureOk"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Ok" />


</LinearLayout>

3

Для тих, у кого той самий глюк <LinearLayout...> як і я:

Важливо вказати android:layout_width="fill_parent", це не буде працюватиwrap_content .

ОТО, ви можете пропустити android:layout_weight = "0" , це не потрібно.

Мій код в основному той самий, що і код у https://stackoverflow.com/a/25781167/755804 (автор Vivek Pandey)


3

Ви повинні уникати розміщення 2 відносних макетів, оскільки відносний макет завжди робить 2 проходи для малювання (проти 1 для будь-якого іншого типу макета). Це стає експоненціальним, коли ви гніздите їх. Ви повинні використовувати лінійний макет із шириною = 0 і вагою = 1 на елементі, який ви хочете заповнити зліва. Ця відповідь краща для продуктивності та практики. Пам'ятайте: використовуйте відносний макет ТІЛЬКИ, коли у вас немає іншого вибору.

<?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="match_parent"
          android:orientation="vertical">

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/prev_button"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:text="&lt;" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ellipsize="end"
            android:singleLine="true"
            android:gravity="center"
            android:text="TextView" />

        <Button
            android:id="@+id/next_button"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:text="&gt;" />
    </LinearLayout>
</LinearLayout>

0

Ви можете використовувати встановити layout_widthабо layout_widthна 0dp(За орієнтацією, яку ви хочете заповнити залишився пробіл). Потім використовуйте, layout_weightщоб заповнити залишився простір.


0

використовуйте відносний простір, щоб обернути LinearLayout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:round="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
    <Button
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text="&lt;"/>
    <TextView
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_weight = "1"/>
    <Button
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text="&gt;"/>

</LinearLayout>

</RelativeLayout>`

0

я знайшов

 <TextView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginEnd="10dp"
        android:fontFamily="casual"
        android:text="(By Zeus B0t)"
     ``   android:textSize="10sp"
        android:gravity="bottom"
        android:textStyle="italic" />

0

Використовуючи відносну компоновку, ви можете зробити вигляд розтягнутим, прив’язавши його до обох видів, до яких він повинен тягнутися. Хоча вказана висота буде ігнорована, Android все ще потребує атрибуту висоти, саме тому я написав "0dp". Приклад:

<View
    android:id="@+id/topView"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_alignParentTop="true"
    android:layout_marginTop="8dp"/>

<View
    android:id="@+id/stretchableView"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_below="@id/topView"
    android:layout_above="@+id/bottomView"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"
    android:adjustViewBounds="true"/>

<View
    android:id="@id/bottomView"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="16dp"/>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.