Як зробити простір між дітьми 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);

Це може допомогти, якщо ви додали файл XML, до якого потрібно додати представлення даних.
Денніс Зима

2
Ось чудовий пост у блозі про це: Grid Spacing на Android від Cyril Mottier
Richard Le Mesurier

Відповіді:


131

Ви повинні android:layout_margin<Side>на дітей. Накладка внутрішня.


Ви можете визначити подання в XML з потрібними полями та додавати заздалегідь задані представлення процедурно, застосовуючи також вміст у Java-коді.
Майк Йокі

Мені не зовсім зрозуміло, що ти маєш на увазі під цим. Я повинен визначити customview у xml? Але мені потрібно буде динамічно створити довільну кількість користувацьких представлень, які потім я додам до моєї LinearLayout.
ab11

2
Спробуйте просто використовувати LayoutParams, а не MarginLayoutParams.
Томас

1
Який атрибут я б встановив у LinearLayout.LayoutParams? Цей клас, схоже, не має "запасів" чи "прокладки" чи чогось подібного?
ab11

@Thomas, що ви маєте на увазі під "padding є внутрішнім". Чи слід застосовувати запас у кожному з компонентів, чого я намагаюся уникати, щоб мінімізувати повторювані коди (оскільки я маю рівний проміжок, який потрібно використовувати між компонентами моєї дитини)
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>

Ви можете використовувати його в API <11, якщо ви використовуєте LinearLayoutCompat: developer.android.com/reference/android/support/v7/widget/…
андроїд розробник

5
якщо ви зробите форму як квадрат, ви можете використовувати її у вертикальних та горизонтальних LinearLayouts без необхідності створювати нову, яка має ширину.
WarrenFaith

2
Ось чудовий запис про це в блозі: Grid Spacing на Android від Cyril Mottier
Richard Le Mesurier

1
Це набагато краще, якщо ви маєте набір поглядів і перевернете деякі з них GONE. Вказавши, android:showDividers="middle"ви отримаєте лише місце, де вам це потрібно.
ДарійL

@DariusL Я не можу знайти цей атрибут showDividers в d.android.com. Ви впевнені, що ми можемо це використовувати?
Генрі

35

Тепер Android підтримує додавання пробілу між переглядами. Він доступний від 4.0 ICS і далі.


12
Мабуть, Android-Фея послухала вас і створила перегляд "Простір" в API 14 :) ( developer.android.com/reference/android/widget/Space.html )
shaylh

ЛОЛ! Це було лише питання часу.
працював

8
але потрібно з пробілом на перегляд, який не є таким, як оголосити пробіл для всіх представлень даних.
Закладіть Гонсалес

^ Дуже вірно. Однак якщо ви використовуєте 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 = новий 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"

і це впорається з вами рештою!


1
Вам потрібно спочатку вказати роздільник, який можна прочитати, або ви можете просто використовувати його ні з чим іншим?
Тім Кіст

8dpзвідки це взялося?
Yousha Aleayoub

1
@TimKist ви можете використовувати його ні з чим іншим, я думаю
teh.fonsi

Ця відповідь невірна, тому що android: delierPadding не впливає на відстань між дітьми лінійного планування. Застосовується накладка до сторін роздільника, які не стикаються з дітьми (наприклад, ліва і права накладки на дільниці у вертикальній лінії LinearLayout). Документація на Android: developer.android.com/reference/android/widget/…
leorleor

2
@leorleor Ви маєте рацію. Найкращий спосіб - це, мабуть, використовувати прозорий роздільник, який є прозорим. Я відповідно оновив свою відповідь.
teh.fonsi

4

Використовуйте LinearLayout.LayoutParamsзамість MarginLayoutParams. Ось документація.


Який атрибут я б встановив у LinearLayout.LayoutParams? Цей клас, схоже, не має "запасів" чи "прокладки" чи чогось подібного?
ab11

LinearLayout.LayoutParamsрозширюється, MarginLayoutParamsі він успадковує той же setMargins()метод, який ви використовували вище ...
Кріс Фей

О-о, дякую! Я дивився на: android.view.ViewGroup.LayoutParams
ab11

3

Якщо ви використовуєте ActionBarSherlock , ви можете використовувати com.actionbarsherherlock.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>

2

Використання прокладки в макеті Дитячого подання.

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

На наступному зображенні показано два зображення ImageView, додані з підкладкою:

Набивання дітей


-1

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

video?.text="Video NR1: ${obj.Titulo} \n" 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.