Как указать расстояние между элементами LinearLayout только один раз?

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

LinearLayout является очень удобным layout manager. Но то, что я полностью пропустил, - это возможность добавить определенное пространство между элементами (например, дополнением) в одном теге XML.

Что я имею в виду под одним тегом, я могу определить в объявлении LinearLayout интервал между элементами (например, в вертикальном LinearLayout вертикальное пространство между двумя элементами в этом макете).

Я знаю, что могу сделать это, добавив XML-тег android:layout_marginTop или что-то похожее на каждый элемент LinearLayout.

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

Кто-нибудь знает простой способ сделать это (не реализуя пользовательский LinearLayout или что-то в этом роде)? Я предпочитаю решение, которое работает непосредственно в XML без необходимости кодирования.

Ответы

Ответ 1

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

android:style="@style/mystyle"

<style name="mystyle">
      <item name="android:layout_marginTop">10dp</item>
      ... other things that your elements have in common
</style>

Ответ 2

Задайте настраиваемый прозрачный чертеж как разделитель для вашего макета:

<LinearLayout
  android:showDividers="middle"
  android:divider="@drawable/divider">

Новый доступный ресурс в папке drawables (divider.xml):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android = "http://schemas.android.com/apk/res/android">
  <size
    android:width = "0dp"
    android:height = "16dp"/>
</shape>

Ответ 3

@Ответ Криса-Тюльпа действительно помог мне - с хорошей практикой тоже.

Для тех из вас, кто может получить ошибку Eclipse об отсутствии идентификатора ресурса для "Style" в пакете android, как и я, вам не нужно добавлять пространство имен android.

Итак, android: style = "xx" вызывает ошибку, а стиль = "xx" правильный. Funky, но для тех, у кого есть эта ошибка, это может помочь.

Ответ 4

Вы можете определить свой единственный элемент "prototype" в отдельном XML файле, а затем раздуть элементы из этого файла динамически в коде и вставить их в свой линейный макет.

Затем вы определяете интервал фактического элемента, а не родительский LinearLayout (например, android:layout_marginTop), и этот интервал будет применяться ко всем вашим элементам при их раздутии.

EDIT:

container.xml:

<LinearLayout
    android:id="@+id/parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Your items will be added here -->

</LinearLayout>

item.xml:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="4dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is my child" />

</LinearLayout>

MyActivity.java:

// Put this in a suitable place in your Java code, perhaps
// in "onCreate" or "onResume" depending on where and how
// you initialize your view. You can, of course inflate
// any number of instances of the item and add them to
// your parent LinearLayout.
LayoutInflater inflater = LayoutInflater.from(context);
View item = inflater.inflate(R.layout.item, null, false);

LinearLayout container = findViewById(R.id.parent);
container.addView(view);

Я не прилагал усилий для тестирования кода, но он должен "работать" как есть: -)

Ответ 5

Вы должны добавить android:layout_marginTop или android:layout_marginLeft к элементу, который должен иметь отступ. Зависит от android:orientation вашего LinearLayout.