it-roy-ru.com

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

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

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

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

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

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

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

17
Dude

рекомендуется применить стиль ко всем элементам линейного макета. 

Android:style="@style/mystyle"

<style name="mystyle">
      <item name="Android:layout_marginTop">10dp</item>
      ... other things that your elements have in common
</style>
18
chris-tulip

Установите настраиваемый прозрачный объект в качестве разделителя для макета:

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

Новый ресурс Drawable в папке Drawables (divr.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>
4
Zon

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

Для тех из вас, кто может получить ошибку Eclipse из-за отсутствия идентификатора ресурса «Стиль» в пакете Android, как я, вам не нужно добавлять пространство имен Android. 

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

1
Watercayman

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

0
Iurii

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

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

РЕДАКТИРОВАТЬ:

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

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

0
dbm