Поля LinearLayout, RelativeLayout и т. д. работают не так, как ожидалось.

Поля в групповых макетах, похоже, не работают.

Например,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_margin="40dip"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="I'm a button" />

</LinearLayout>

должна отображать кнопку с полями 40p со всех сторон. Тем не менее, он имеет поля 80p справа и снизу.

Я делаю что-то неправильно? Это ошибка?

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

Кстати, аналогичный вопрос опубликован здесь, но не был дан ответ.


person Matt    schedule 23.03.2011    source источник
comment
попробуйте установить центр кнопки горизонтально   -  person AndroidGeek    schedule 17.07.2014


Ответы (4)


android:padding="40dp" на LinearLayout или android:layout_margin="40dp" на кнопке даст вам нужный эффект. Отступ определяет пространство между краями представления и его содержимым, поле макета определяет дополнительное пространство по бокам представления.

person Robby Pond    schedule 23.03.2011
comment
Поля должны отступать от LinearLayout со всех сторон на 40dp. Странно, что он не работает, как ожидалось. - person Muhammad Babar; 22.04.2015

Проблема на самом деле в том, как FrameLayout интерпретирует поля. setContentView() прикрепляет ваш «основной» макет к FrameLayout, который является фактическим корнем иерархии представлений (это можно увидеть с помощью средства просмотра иерархии) и предлагается вам по телефону.

Поля управляются родительским макетом, поэтому в данном случае это main FrameLayout. Я не знаю, особенность это или ошибка, но именно так этот макет интерпретирует поля.

Итак, решение уже было опубликовано, пока я печатал: вместо этого используйте отступы.

person bigstones    schedule 23.03.2011
comment
Я помню, как исправлял некоторые ошибки с тем, как FrameLayout обрабатывает поля во время таймфрейма Honeycomb, и это включало настройку гравитации по умолчанию. Может действительно баг. :) - person adamp; 24.03.2011
comment
Другой способ установить android:layout_gravity=top|left для просмотра внутри FrameLayout. - person VinceStyling; 14.11.2013

если вам нужно установить поле для макета, просто оберните его другим линейным или относительным макетом

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

  <LinearLayout android:layout_margin="40dip"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button android:id="@+id/button"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:text="I'm a button" />

  </LinearLayout>

</LinearLayout>
person yorkw    schedule 23.08.2011
comment
Это лучший ответ. Отступы — это не обязательно то, что вам нужно, особенно если ваш макет имеет видимый фон. - person Christopher Pickslay; 11.03.2014
comment
Вы должны избегать вложенных макетов только для того, чтобы дать отступ внутреннему. developer.android.com/training/improving-layouts/ . Это не лучший ответ в любом случае. - person Pedro Oliveira; 25.02.2015

Обертывание линейного макета другим макетом — лучшая стратегия.

person Pratha    schedule 17.03.2019