Wie mache ich Platz zwischen LinearLayout-Kindern?

159

Ich füge einem vertikalen LinearLayout programmgesteuert benutzerdefinierte Ansichten hinzu, und ich möchte, dass zwischen den Ansichten ein gewisser Abstand vorhanden ist. Ich habe versucht, meinem CustomView-Konstruktor Folgendes hinzuzufügen: setPadding (0, 1, 0, 1), aber dies scheint keine Auswirkungen zu haben. Irgendein Rat?

* Es wurde darauf hingewiesen, dass ich Ränder verwenden sollte. Da ich dynamisch Ansichten hinzufüge, muss ich die Ränder aus dem Code festlegen (nicht in XML). Ich glaube, der Weg dazu ist unten, aber es funktioniert nicht.

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

*Bearbeiten. Ich habe auch versucht, MarginLayoutParams als Parameter zu verwenden, während ich die Ansichten zum linearen Layout hinzufügte (siehe unten). Das hat auch nicht funktioniert:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);
ab11
quelle
Es kann hilfreich sein, wenn Sie die XML-Datei hinzugefügt haben, zu der Sie die Ansichten hinzufügen möchten.
Dennis Winter
2
Hier ist ein ausgezeichneter Blog-Beitrag darüber: Grid Spacing auf Android von Cyril Mottier
Richard Le Mesurier

Antworten:

131

Sie sollten android:layout_margin<Side>auf die Kinder. Die Polsterung ist intern.

Thomas
quelle
Sie können die Ansicht in XML mit den gewünschten Rändern definieren und die vordefinierten Ansichten prozedural hinzufügen, wobei Sie den Inhalt auch in Java-Code anwenden.
Mike Yockey
Mir ist nicht wirklich klar, was du damit meinst. Ich sollte die benutzerdefinierte Ansicht in XML definieren? Ich muss jedoch dynamisch eine beliebige Anzahl von benutzerdefinierten Ansichten erstellen, die ich dann meinem LinearLayout hinzufüge.
ab11
2
Versuchen Sie, nur LayoutParams und nicht MarginLayoutParams zu verwenden.
Thomas
1
Welches Attribut würde ich in LinearLayout.LayoutParams festlegen? Diese Klasse scheint keine "Ränder" oder "Polsterung" oder ähnliches zu haben?
ab11
@Thomas was meinst du mit "Auffüllen ist intern". Sollte ich in jeder der Komponenten einen Rand anwenden, den ich zu vermeiden versuche, um doppelte Codes zu minimieren (da ich den gleichen Abstand zwischen meinen
untergeordneten
187

Die API> = 11 Lösung:

Sie können die Polsterung in den Teiler integrieren. Wenn Sie keine verwendet haben, erstellen Sie einfach ein großes leeres Zeichenobjekt und legen Sie es als LinearLayoutTeiler fest:

    <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
quelle
Sie können es auf API <11 verwenden, wenn Sie LinearLayoutCompat verwenden: developer.android.com/reference/android/support/v7/widget/…
Android Developer
5
Wenn Sie die Form wie ein Quadrat gestalten, können Sie sie in vertikalen und horizontalen LinearLayouts verwenden, ohne eine neue mit Breite erstellen zu müssen.
WarrenFaith
2
Hier ist ein ausgezeichneter Blog-Beitrag darüber: Grid Spacing auf Android von Cyril Mottier
Richard Le Mesurier
1
Dies ist viel besser, wenn Sie eine Reihe von Ansichten haben und einige davon drehen GONE. Wenn android:showDividers="middle"Sie angeben, erhalten Sie nur den Platz, an dem Sie ihn tatsächlich benötigen.
DariusL
@DariusL Ich kann dieses showDividers-Attribut in d.android.com nicht finden. Sind Sie sicher, dass wir dies verwenden können?
Henry
35

Android unterstützt jetzt das Hinzufügen einer Leerzeichenansicht zwischen Ansichten. Es ist ab 4.0 ICS verfügbar.

hat funktioniert
quelle
12
Anscheinend hat die Android-Fee Ihnen zugehört und eine "Space" -Ansicht in API 14 erstellt :) ( developer.android.com/reference/android/widget/Space.html )
shaylh
LOL! Es war nur eine Frage der Zeit.
arbeitete
8
Sie müssen jedoch ein Leerzeichen pro Ansicht festlegen, was nicht mit dem Deklarieren einer Lücke für alle Ansichten identisch ist.
Lay González
^ Sehr wahr. Wenn Sie jedoch ein LinearLayout verwenden, können Sie einen Teiler hinzufügen, der auf jede untergeordnete Ansicht angewendet wird. Siehe hier: developer.android.com/reference/android/widget/…
arbeitete
1
Dies ist keine Antwort.
Stealth Rabbi
24

Das folgende Beispiel macht genau das, was Sie programmatisch benötigen. Ich habe eine feste Größe von (140.398) verwendet.

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);
Gorki
quelle
Ich habe es mit einem weiteren Schritt wie unten gemacht. LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); und dann button1.setLayoutParams (layoutParams); layout.addView (button, layoutParams); .. Vielen Dank, dass Sie uns mitgeteilt haben, dass addview zwei Argumente annehmen kann.
png
6

Seit API Level 14 können Sie einfach einen (transparenten) Zeichner hinzufügen, der gezeichnet werden kann:

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

und es wird den Rest für Sie erledigen!

teh.fonsi
quelle
1
Müssen Sie zuerst einen Teiler angeben, der gezeichnet werden kann, oder können Sie ihn einfach mit nichts anderem verwenden?
Tim Kist
8dpWoher kam das?
Yousha Aleayoub
1
@ TimKist Sie können es mit nichts anderem verwenden, denke ich
teh.fonsi
Diese Antwort ist falsch, da android: dividerPadding den Abstand zwischen untergeordneten linearen Layouts nicht beeinflusst. Es werden die Seiten des Teilers gepolstert, die nicht den Kindern zugewandt sind (z. B. die linke und rechte Polsterung eines Teilers in einem vertikalen linearen Layout). Android-Dokumentation: developer.android.com/reference/android/widget/…
leorleor
2
@leorleor Du hast recht. Der beste Weg ist wahrscheinlich, einen Teiler zu verwenden, der transparent ist. Ich habe meine Antwort entsprechend aktualisiert.
teh.fonsi
4

Verwenden Sie LinearLayout.LayoutParamsanstelle von MarginLayoutParams. Hier ist die Dokumentation.

Chris Fei
quelle
Welches Attribut würde ich in LinearLayout.LayoutParams festlegen? Diese Klasse scheint keine "Ränder" oder "Polsterung" oder ähnliches zu haben?
ab11
LinearLayout.LayoutParamserweitert MarginLayoutParamsund erbt die gleiche setMargins()Methode, die Sie oben verwendet haben ...
Chris Fei
Ohhhhh, danke! Ich habe gesucht: android.view.ViewGroup.LayoutParams
ab11
3

Wenn Sie ActionBarSherlock verwenden , können Sie com.actionbarsherlock.internal.widget.IcsLinearLayout verwenden:

<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-Entwickler
quelle
2

Verwenden der Polsterung im Layout der untergeordneten Ansicht.

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
quelle
0

Sie können das LayoutParamsübergeordnete LinearLayoutElement abrufen und auf folgende Weise auf die einzelnen Ansichten anwenden:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • Achten Sie darauf, dass setMargins () Pixel als int-Datentyp verwendet. Konvertieren Sie daher vor dem Hinzufügen von Werten in dp
  • Der obige Code setzt Höhe und Breite auf wrap_content. Sie können es anpassen.
Harish Rana
quelle
0

Versuchen Sie, das Space- Widget hinzuzufügen, nachdem Sie die Ansicht wie folgt hinzugefügt haben:

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)
Oleg Nekrasov
quelle
0

Eine einfache Möglichkeit, dies dynamisch zu tun, besteht darin , den Kindern Polster hinzuzufügen . Sie können es einfach mit .setPadding () für das hinzuzufügende Objekt festlegen. In diesem Beispiel wird einem LinearLayout eine ImageView hinzugefügt:

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

Das folgende Bild zeigt zwei ImageViews, die mit Auffüllung hinzugefügt wurden:

Polsterung auf Kinder

BetroffenerHobbit
quelle
-1

Wenn Ihr Layout Beschriftungen oder einen Textcontainer enthält. Sie können am Ende jedes Textes "\ n" hinzufügen , um eine Linie zu teilen und Platz zwischen den Elementen zu schaffen.
Beispiel:

video?.text="Video NR1: ${obj.Titulo} \n" 
Gian Gomen
quelle