Как сделать пространство между детьми LinearLayout?

160

Я программно добавляю пользовательские виды в вертикальный LinearLayout, и я хотел бы, чтобы между видами было некоторое пространство. Я попытался добавить: setPadding (0, 1, 0, 1) в мой конструктор CustomView, но это, похоже, не имеет никакого эффекта. Любой совет?

* Было указано, что я должен использовать поля. Поскольку я динамически добавляю представления, мне нужно установить поля из кода (не в xml). Я считаю, что способ сделать это ниже, но он не работает.

public class MyView extends View
{
    public MyView (Context context)
    {
        super(context);

        MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT);
        params.setMargins(0, 10, 0, 10);
        setLayoutParams(params);

*Редактировать. Я также попытался использовать MarginLayoutParams в качестве параметра при добавлении представлений в линейный макет (как показано ниже). Это также не сработало:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);
AB11
источник
Это может помочь, если вы добавили XML-файл, в который хотите добавить представления.
Денис Винтер
2
Вот отличная запись в блоге об этом: Grid Spacing на Android от Cyril Mottier
Ричард Ле Мезурье

Ответы:

132

Вы должны android:layout_margin<Side>на детей. Обивка внутренняя.

Томас
источник
Вы можете определить представление в XML с требуемыми полями и процедурно добавить предопределенные представления, применяя также контент в коде Java.
Майк Йоки
Я не совсем понимаю, что вы имеете в виду под этим. Я должен определить customview в XML? Но мне нужно будет динамически создать произвольное количество пользовательских представлений, которые я затем добавлю в свой LinearLayout.
ab11
2
Попробуйте просто использовать LayoutParams, а не MarginLayoutParams.
Томас
1
Какой атрибут я бы установил в LinearLayout.LayoutParams? В этом классе нет «полей», «отступов» или чего-то подобного?
ab11
@ Томас, что ты имеешь в виду под "Паддинг является внутренним". Должен ли я применять маржу в каждом из компонентов, чего я стараюсь избегать, чтобы минимизировать дублирующиеся коды (поскольку у меня равное расстояние между моими дочерними компонентами)
OmGanesh
188

API> = 11 решение:

Вы можете интегрировать заполнитель в разделитель. Если вы не использовали ничего, просто создайте высокий пустой рисованный объект и установите его как LinearLayoutразделитель:

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

empty_tall_divider.xml:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
            android:height="40dp"
            android:width="0dp"/>
</shape>
riwnodennyk
источник
Вы можете использовать его в API <11, если вы используете LinearLayoutCompat: developer.android.com/reference/android/support/v7/widget/…
разработчик Android
5
если вы делаете форму как квадрат, вы можете использовать ее в вертикальной и горизонтальной LinearLayouts без необходимости создавать новую, которая имеет ширину.
WarrenFaith
2
Вот отличная запись в блоге об этом: Grid Spacing на Android от Cyril Mottier
Ричард Ле Мезурье
1
Это намного лучше, если у вас есть набор мнений и включите некоторые из них GONE. Указав, android:showDividers="middle"вы получите только место, где вам это действительно нужно.
DariusL
@DariusL Я не могу найти этот атрибут showDividers в d.android.com, вы уверены, что мы можем использовать это?
Генри
35

Android теперь поддерживает добавление вида Space между представлениями. Он доступен начиная с 4.0 ICS.

работал
источник
12
Очевидно, Android-Фея выслушала вас и создала представление «Космос» в API 14 :) ( developer.android.com/reference/android/widget/Space.html )
shaylh
РЖУНИМАГУ! Это было только вопросом времени.
работал
8
но вам нужно указывать пробел для каждого просмотра, который отличается от объявления пропуска для всех представлений.
Lay González
^ Очень верно. Однако, если вы используете LinearLayout, вы можете добавить разделитель, который будет применяться к каждому дочернему представлению. Смотрите здесь: developer.android.com/reference/android/widget/…
работал
1
Это не ответ.
Раввин Стелс
24

Пример ниже просто делает то, что вам нужно программно. Я использовал фиксированный размер (140 398).

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);
Горький
источник
Я делал это с помощью еще одного дополнительного шага, как показано ниже LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); и затем button1.setLayoutParams (layoutParams); layout.addView (кнопка, layoutParams); .. Спасибо, что сообщили, что addview может принимать 2 аргумента.
PNG
6

Начиная с уровня API 14, вы можете просто добавить (прозрачный) разделитель для рисования:

android:divider="@drawable/divider"
android:showDividers="middle"

и он позаботится об остальном для вас!

teh.fonsi
источник
1
Вам нужно сначала указать делитель, который можно нарисовать, или вы можете использовать его только для чего-то другого?
Тим Кист
8dpоткуда это взялось?
Юша Алеауб
1
@TimKist вы можете использовать его ни с чем другим, я думаю
teh.fonsi
Этот ответ неверен, потому что android: dividerPadding не влияет на расстояние между дочерними элементами линейного макета. Он применяет отступы к сторонам разделителя, которые не обращены к дочерним элементам (например, отступы слева и справа на разделителе в вертикальном LinearLayout). Документация по Android: developer.android.com/reference/android/widget/…
leorleor
2
@ leorleor Вы правы. Лучше всего, вероятно, использовать прозрачный разделитель. Я обновил свой ответ соответственно.
ТехФонси
4

Используйте LinearLayout.LayoutParamsвместо MarginLayoutParams. Вот документация.

Крис Фэй
источник
Какой атрибут я бы установил в LinearLayout.LayoutParams? В этом классе нет «полей», «отступов» или чего-то подобного?
ab11
LinearLayout.LayoutParamsрасширяется, MarginLayoutParamsи он наследует тот же setMargins()метод, который вы использовали выше ...
Крис Фэй
Ооооо, спасибо! Я смотрел на: android.view.ViewGroup.LayoutParams
ab11
3

Если вы используете ActionBarSherlock , вы можете использовать com.actionbarsherlock.internal.widget.IcsLinearLayout:

<com.actionbarsherlock.internal.widget.IcsLinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="@drawable/list_view_divider"
        android:dividerPadding="2dp"
        android:showDividers="middle" >
...
</com.actionbarsherlock.internal.widget.IcsLinearLayout>
разработчик Android
источник
2

Использование отступов в макете Child View.

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_margin="5dp"
          android:background="@drawable/backage_text"
          android:textColor="#999999"
           >

</TextView>

backage_text.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="@color/white"/>
    <corners android:radius="2dp"/>
    <stroke
        android:width="1dp"
        android:color="#999999"/>
    <padding
        android:bottom="5dp"
        android:left="10dp"
        android:right="10dp"
        android:top="5dp" />
</shape>
Френсис Бэкон
источник
0

Вы можете получить LayoutParamsродительский элемент LinearLayoutи применить к отдельным представлениям следующим образом:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • Позаботьтесь о том, чтобы setMargins () принимала пиксели как тип данных int. Так что, перед добавлением значений преобразуйте в dp
  • Выше код установит высоту и ширину в wrap_content. Вы можете настроить его.
Хариш Рана
источник
0

Попробуйте добавить виджет Space после добавления вида следующим образом:

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)
Олег Некрасов
источник
0

Простой способ сделать это динамически - это добавить отступы для детей . Вы можете просто установить его, используя .setPadding () для объекта, который будет добавлен. Этот пример добавляет ImageView к LinearLayout:

LinearLayout userFeedLinearLayout = (LinearLayout) findViewById(R.id.userFeedLinearLayout);
imageView.setImageBitmap(bitmap);
imageView.setPadding(0, 30, 0, 30);
userFeedLinearLayout.addView(imageView);

Следующее изображение показывает два ImageViews, которые были добавлены с отступом:

Обивка на детей

ConcernedHobbit
источник
-1

Если ваш макет содержит метки o какой-то контейнер для текста. Вы можете добавить в конце каждого текста "\ n", чтобы разбить строку и сделать пробел между элементами.
Пример:

video?.text="Video NR1: ${obj.Titulo} \n" 
Джан Гомен
источник