Jak zrobić odstęp między dziećmi LinearLayout?

160

Programowo dodam widoki niestandardowe do pionowego układu LinearLayout i chciałbym, aby między widokami było trochę miejsca. Próbowałem dodać: setPadding (0, 1, 0, 1) do mojego konstruktora CustomView, ale nie wydaje się to mieć żadnego efektu. Jakakolwiek rada?

* Wskazano, że powinienem stosować marginesy. Ponieważ dynamicznie dodam widoki, muszę ustawić marginesy z kodu (nie w xml). Uważam, że sposób na to jest poniżej, ale to nie działa.

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

*Edytować. Próbowałem również użyć MarginLayoutParams jako parametru podczas dodawania widoków do układu liniowego (jak poniżej). To też nie zadziałało:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);
ab11
źródło
Może pomóc, jeśli dodasz plik XML, do którego chcesz dodać widoki.
Dennis Winter
2
Oto doskonały wpis na blogu na ten temat: Odstępy siatki na Androida autorstwa Cyrila Mottiera
Richard Le Mesurier

Odpowiedzi:

131

Powinieneś android:layout_margin<Side>na dzieciach. Wypełnienie jest wewnętrzne.

Tomasz
źródło
Możesz zdefiniować widok w XML z żądanymi marginesami i proceduralnie dodać predefiniowane widoki, stosując również zawartość w kodzie Java.
Mike Yockey
Nie bardzo rozumiem, co przez to rozumiesz. Powinienem zdefiniować Customview w xml? Ale będę musiał dynamicznie utworzyć dowolną liczbę niestandardowych widoków, które następnie dodam do mojego LinearLayout.
ab11
2
Spróbuj po prostu użyć LayoutParams, a nie MarginLayoutParams.
Thomas
1
Jaki atrybut powinienem ustawić w LinearLayout.LayoutParams? Wygląda na to, że ta klasa nie ma „marginesów”, „wypełnienia” ani niczego podobnego?
ab11
@Thomas, co masz na myśli, mówiąc „Wypełnienie jest wewnętrzne”. Czy powinienem stosować marginesy w każdym z komponentów, których staram się unikać, aby zminimalizować powielanie kodów (ponieważ mam równe odstępy między elementami podrzędnymi)
OmGanesh
188

Rozwiązanie API> = 11 :

Możesz zintegrować wyściółkę z przegrodą. W przypadku, gdy nie używasz żadnego, po prostu utwórz wysoki pusty element do rysowania i ustaw go jako LinearLayoutdzielnik:

    <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
źródło
Możesz go używać w API <11, jeśli używasz LinearLayoutCompat: developer.android.com/reference/android/support/v7/widget/ ...
programista Androida
5
jeśli utworzysz kształt jak kwadrat, możesz go użyć w pionowych i poziomych układach liniowych bez konieczności tworzenia nowego, który ma szerokość.
WarrenFaith
2
Oto doskonały wpis na blogu na ten temat: Odstępy siatki na Androida autorstwa Cyrila Mottiera
Richard Le Mesurier
1
Jest to o wiele lepsze, jeśli masz zestaw poglądów i włączasz niektóre z nich GONE. Określając android:showDividers="middle", otrzymasz miejsce tylko tam, gdzie jest to naprawdę potrzebne.
DariusL
@DariusL Nie mogę znaleźć tego atrybutu showDividers w d.android.com, czy na pewno możemy go użyć?
Henry
35

Android obsługuje teraz dodawanie widoku przestrzeni między widokami. Jest dostępny od 4.0 ICS.

pracował
źródło
12
Najwyraźniej Android-Fairy cię posłuchał i utworzył widok "Space" w API 14 :) ( developer.android.com/reference/android/widget/Space.html )
shaylh
LOL! To była tylko kwestia czasu.
pracował
8
ale musisz ustawić przestrzeń na widok, co nie jest tym samym, co zadeklarowanie luki dla wszystkich widoków.
Lay González
^ Bardzo prawda. Jeśli jednak używasz LinearLayout, możesz dodać dzielnik, który zostanie zastosowany do każdego widoku podrzędnego. Zobacz tutaj: developer.android.com/reference/android/widget/…
działał
1
To nie jest odpowiedź.
Stealth Rabbi
24

Poniższy przykład robi programowo to, czego potrzebujesz. Użyłem stałego rozmiaru (140 398).

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);
Gorkiego
źródło
Robiłem to z jeszcze jednym dodatkowym krokiem, jak poniżej LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); a następnie button1.setLayoutParams (layoutParams); layout.addView (przycisk, layoutParams); .. Dzięki za poinformowanie, że addview może przyjąć 2 argumenty.
png
6

Od poziomu API 14 możesz po prostu dodać (przezroczysty) rysowany separator:

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

a resztą zajmie się za Ciebie!

teh.fonsi
źródło
1
Czy musisz najpierw określić dzielnik do rysowania, czy możesz go po prostu użyć z niczym innym?
Tim Kist,
8dpskąd to się wzięło?
Yousha Aleayoub
1
@TimKist, możesz go użyć z niczym innym myślę
teh.fonsi
Ta odpowiedź jest nieprawidłowa, ponieważ android: dividerPadding nie wpływa na odległość między elementami podrzędnymi układu liniowego. Stosuje wypełnienie po bokach separatora, które nie są zwrócone w stronę dzieci (np. Lewe i prawe wypełnienie separatora w pionowym LinearLayout). Dokumentacja na Androida: developer.android.com/reference/android/widget/ ...
leorleor
2
@leorleor Masz rację. Najlepszym sposobem jest prawdopodobnie użycie rysowanej przekładki, która jest przezroczysta. Odpowiednio zaktualizowałem swoją odpowiedź.
teh.fonsi
4

Użyj LinearLayout.LayoutParamszamiast MarginLayoutParams. Oto dokumentacja.

Chris Fei
źródło
Jaki atrybut powinienem ustawić w LinearLayout.LayoutParams? Wygląda na to, że ta klasa nie ma „marginesów”, „wypełnienia” ani niczego podobnego?
ab11
LinearLayout.LayoutParamsrozszerza się MarginLayoutParamsi dziedziczy tę samą setMargins()metodę, której używałeś powyżej ...
Chris Fei
Ohhhhh, dziękuję!
Patrzyłem
3

Jeśli używasz ActionBarSherlock , możesz użyć 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>
programista Androida
źródło
2

Używanie dopełnienia w układzie widoku podrzędnego.

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>
Francis Bacon
źródło
0

Możesz uzyskać LayoutParamsrodzica LinearLayouti zastosować do poszczególnych widoków w ten sposób:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • Uważaj, aby setMargins () przyjmowało piksele jako typ danych int, więc przed dodaniem wartości przekonwertuj je na dp
  • Powyższy kod ustawi wysokość i szerokość na wrap_content. możesz go dostosować.
Harish Rana
źródło
0

Spróbuj dodać widżet Space po dodaniu widoku takiego:

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)
Oleg Niekrasow
źródło
0

Łatwym sposobem, aby to zrobić dynamicznie, jest dodanie wyściółki do dzieci . Możesz po prostu ustawić to za pomocą .setPadding () na dodawanym obiekcie. W tym przykładzie jest dodawanie ImageView do LinearLayout:

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

Poniższy obraz przedstawia dwa ImageViews, które zostały dodane z dopełnieniem:

Wyściółka dla dzieci

ConcernedHobbit
źródło
-1

Jeśli twój układ zawiera etykiety lub jakiś kontener na tekst. Możesz dodać na końcu każdego tekstu "\ n", aby podzielić linię i zrobić odstęp między elementami.
Przykład:

video?.text="Video NR1: ${obj.Titulo} \n" 
Gian Gomen
źródło