Лінійний макет Android - як зберегти елемент внизу?


75

У мене є TextViewякий я хочу закріпити внизу альбомної діяльності, яка використовується LinearLayoutз вертикально розташованими елементами.

Я встановив android:gravity="bottom"для перегляду тексту, але він все ще любить бути трохи нижче останнього елемента LinearLayoutсаме того, що я не хочу, щоб він робив.

Будь-які пропозиції?


Просто видаліть android:gravity="bottom"з TextViewі додайте його в LinearLayout. Ваша проблема буде вирішена.
Переповнення стеку

Відповіді:


109

Оновлення: Я все ще отримую голоси за це питання, яке все ще є прийнятою відповіддю і на яке, на мою думку, я відповів погано. У дусі переконатися, що найкраща інформація є там, я вирішив оновити цю відповідь.

У сучасному Android я б ConstraintLayoutце робив. Це ефективніше і зрозуміліше.

<ConstraintLayout>
   <View
      android:id="@+id/view1"
      ...other attributes elided... />
   <View
      android:id="@id/view2"        
      app:layout_constraintTop_toBottomOf="@id/view1" />
      ...other attributes elided... />

   ...etc for other views that should be aligned top to bottom...

   <TextView
    app:layout_constraintBottom_toBottomOf="parent" />

Якщо ви не хочете використовувати ConstraintLayout, використання LinearLayout із розширеним поданням є простим і чудовим способом зайняти зайвий простір (див. Відповідь @Matthew Wills). Якщо ви не хочете розширювати фон жодного з подань над поданням знизу, можете додати невидимий вигляд, щоб зайняти простір.

Відповідь, яку я спочатку дав, працює, але неефективна. Неефективність може не бути великою проблемою для одного макета верхнього рівня, але це було б жахливою реалізацією в ListViewабо RecyclerView, і просто немає жодних причин для цього, оскільки є кращі способи зробити це приблизно на одному рівні зусиль та складності, якщо не простіше.

Вийміть TextView з LinearLayout, а потім помістіть LinearLayout і TextView всередину RelativeLayout. Додайте атрибут android:layout_alignParentBottom="true"до TextView. З усіма просторами імен та іншими атрибутами, за винятком вищезазначеного, вилучено:

<RelativeLayout>
  <LinearLayout>
    <!-- All your other elements in here -->
  </LinearLayout>
  <TextView
    android:layout_alignParentBottom="true" />
</RelativeLayout>

Це справді вирішило проблему. Я використовую певну висоту для елементів у лінійному макеті
Androider 24.03.11

1
Якщо ви переходите на RelativeLayout, може бути, краще взагалі покінчити з LinearLayout, уникаючи таким чином зайво вкладених макетів?
erichamion

3
Щось на зразок макета, завищеного в 100 або 1000 разів для ListView, однозначно. Для одного макета Діяльності це не великий хіт. Ви обмінюєте зручність програміста за крихітний хіт продуктивності.
Brian Cooley

1
Це не працює для кнопок всередині LinearLayout.
Ігор Ганапольський

120

Вам доведеться розширити один із ваших верхніх видів, щоб заповнити решту місця, встановивши android:layout_weight="1"на ньому. Це призведе до останнього вигляду вниз.

Ось короткий нарис того, що я маю на увазі:

<LinearLayout android:orientation="vertical">
    <View/>
    <View android:layout_weight="1"/>
    <View/>
    <View android:id="@+id/bottom"/>
</LinearLayout>

де кожна з висот погляду дитини є, "wrap_content"а все інше є "fill_parent".


3
Ви повинні додати ширину та висоту: <Переглянути android: layout_weight = "1" android: layout_height = "wrap_content" android: layout_width = "wrap_content" />
uvgroovy

1
Це ефективніше прийнятої відповіді, оскільки вона має лише одну ViewGroup.
Dheeraj Vepakomma

2
Це дивно. Я завжди забуваю цей фокус і в кінцевому підсумку витрачаю назавжди возитися зі своїми макетами. Це просто дивно. Вирішує голод у світі.
Ерік Кохран

1
Це повинна бути правильна відповідь! Не лише тому, що використовується лише один LinearLayout, але коли ви надуваєте DialogFragment необхідним дизайном макета (деякі подання повинні бути внизу), це може стати в нагоді, оскільки з якихось причин я отримав android.view.InflateException: двійковий рядок XML-файлу # 7: ... при використанні RelativeLayout і все чудово працює при використанні LinearLayout.
Драшко

1
@Androider припускає, що це прийнята відповідь, верхня - це просто обхід. Він також чудово працює навіть для елементів перегляду списку.
Фархан

58

Я думаю, що це буде ідеальне рішення:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- Other views -->
    <Space
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <!-- Target view below -->
    <View
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

</LinearLayout>

Це хороше рішення, але працює лише на API 14 рівня та вище.
renatojf

@renatojf Ви також можете спробувати використовувати порожній вигляд чи макет замість простору
Святослав Зайцев

Дякую! це саме те, що мені потрібно і не вимагало від мене жодного вкладання макета. Я думаю, що у вас найкраща відповідь.
Michael Alan Huff

2
Ти геніальна людина !! я витрачаю на це 2 дні, але щось там пропускаю, спасибі (не використовую відносний і компонент - це перегляд пейджера, я маю макет, тому його проблема створюється) - я хочу дати більше одного балу, але не можу
сушант госаві

11

Ви повинні покласти параметр гравітації на дно не в текстовому перегляді, а в лінійному макеті . Подобається це:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="bottom|end">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Something"/>
</LinearLayout>

10

Крок 1: Створіть два види всередині лінійного макета

Крок 2: Перший вигляд повинен бути встановлений на android: layout_weight = "1"

Крок 3: Другий вигляд буде автоматично поміщений вниз

<LinearLayout
android:id="@+id/botton_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

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

    <Button
    android:id="@+id/btn_health_advice"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>


</LinearLayout>

1

СПРАВИТИ ЦЕ

 <LinearLayout
android:id="@+id/LinearLayouts02"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="bottom|end">

<TextView
    android:id="@+id/texts1"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:layout_weight="2"
    android:text="@string/forgotpass"
    android:padding="7dp"
    android:gravity="bottom|center_horizontal"
    android:paddingLeft="10dp"
    android:layout_marginBottom="30dp"
    android:bottomLeftRadius="10dp"
    android:bottomRightRadius="50dp"
    android:fontFamily="sans-serif-condensed"
    android:textColor="@color/colorAccent"
    android:textStyle="bold"
    android:textSize="16sp"
    android:topLeftRadius="10dp"
    android:topRightRadius="10dp"
   />

</LinearLayout>

0

Ви також можете використовувати

android:layout_gravity="bottom"

для перегляду тексту


-2

спробуйте це

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textViewProfileName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.