Wie füge ich einem horizontalen LinearLayout einen (vertikalen) Teiler hinzu?

92

Ich versuche, einem horizontalen linearen Layout einen Teiler hinzuzufügen, komme aber nicht weiter. Der Teiler wird einfach nicht angezeigt. Ich bin ein absoluter Neuling mit Android.

Dies ist mein Layout-XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/llTopBar"
        android:orientation="horizontal"
        android:divider="#00ff00"
        android:dividerPadding="22dip"
        android:showDividers="middle"
       >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="asdf" />
            <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="asdf"
             />

    </LinearLayout>

</RelativeLayout>
Ahmed-Anas
quelle
Auf welcher Android-Version läuft das? setDividerDrawable erst seit API existierte 11
alex
Jelly Bean 4.2 api 17
Ahmed-Anas
Wenn Sie alles andere ausprobiert haben, stellen Sie sicher, dass das LinearLayout die richtige Ausrichtung hat. Das Einstellen einer Höhe für einen Teiler mit horizontaler Ausrichtung ist sehr verwirrend.
Nino van Hooff
1
Vergessen Sie nicht den wütenden SHOWDIVIDERS- Artikel !!!!!!
Fattie

Antworten:

216

Verwenden Sie dies für den horizontalen Teiler

<View
    android:layout_width="1dp"
    android:layout_height="match_parent"
    android:background="@color/honeycombish_blue" />

und dies für vertikale Teiler

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="@color/honeycombish_blue" />

ODER wenn Sie den LinearLayout-Teiler für den horizontalen Teiler verwenden können

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <size android:height="1dp"/>
    <solid android:color="#f6f6f6"/>
</shape>

und in LinearLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@drawable/divider"
    android:orientation="vertical"
    android:showDividers="middle" >

Wenn Sie den vertikalen Teiler verwenden möchten, verwenden Sie ihn anstelle der android:height="1dp"Formandroid:width="1dp"

Tipp: Vergessen Sie den android:showDividersArtikel nicht.

Kapil Vats
quelle
3
Vielen Dank. aber wie füge ich das dem Attribut "android: divider" hinzu? Im Grunde meine ich, eine Art automatische Möglichkeit, den Teiler zwischen jedem Element hinzuzufügen? Ich meine, ist das nicht der Grund, warum das Attribut android: divider vorhanden ist?
Ahmed-Anas
@ Death_relic0 Android: Divider ist verfügbar für ListView, Expandable Listview und TabWidget
Padma Kumar
9
danke, aber warum ist es dann hier: s developer.android.com/reference/android/widget/…
Ahmed-Anas
Es scheint, Sie sollten jede zeichnbare, nicht Farbe verwenden
demaksee
7
Scheint, als hättest du deine layout_widthund layout_heightWerte durcheinander gebracht: denn horizontal layout_widthsollte "fill_parent"und layout_heightsollte sein "1dp". Sollte in ähnlicher Weise gegen den vertikalen Teiler ausgetauscht werden.
Jay Sidri
68

Versuchen Sie dies, erstellen Sie einen Teiler im res/drawableOrdner:

vertikale_divider_1.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">    
    <size android:width="1dip" />
    <solid android:color="#666666" />    
</shape> 

Verwenden Sie das dividerAttribut in LinearLayout wie folgt:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:orientation="horizontal"
    android:divider="@drawable/vertical_divider_1"
    android:dividerPadding="12dip"
    android:showDividers="middle"
    android:background="#ffffff" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

Hinweis: android:divider ist nur in Android 3.0 (API Level 11) oder höher verfügbar.

ShreeshaDas
quelle
Aber das wird nur einen Teiler hinzufügen. Angenommen, ich habe 10 Elemente. Das Hinzufügen von zusätzlichem Code für einen Teiler zwischen jedem Element scheint eine Verschwendung zu sein
Ahmed-Anas
@ death_relic0 Warum erstellen Sie nicht ein separates Layout für den Teiler und fügen es dann mithilfe des Include-Tags überall und so oft Sie möchten hinzu? Ich denke das würde mich besser mehr und keine Verschwendung.
GrIsHu
39

Es ist einfach, dem Layout einen Teiler hinzuzufügen. Wir benötigen keine separate Ansicht.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:divider="?android:listDivider"
    android:dividerPadding="2.5dp"
    android:orientation="horizontal"
    android:showDividers="middle"
    android:weightSum="2" ></LinearLayout>

Über dem Code machen Sie einen vertikalen Teiler für LinearLayout

khaintt
quelle
Ich vergesse immer das showDividers-Attribut. Danke dir!
Unknownweirdo
1
Danke für den Tipp? Android: listDivider. Ich habe gerade bemerkt, dass dies in API 21 oder höher unsichtbar ist. In niedrigeren API-Versionen wird eine kleine graue Linie angezeigt
user114676
@KetanMehta wir werden es mit dem Attribut 'android: divider' definieren, es ist zeichnbar oder farbig.
Khaintt
Unterstützt android: divider API 15 +?
RoCk RoCk
16

Update: Pre-Honeycomb mit AppCompat

Wenn Sie die AppCompat-Bibliothek v7 verwenden, möchten Sie möglicherweise die LinearLayoutCompatAnsicht verwenden. Mit diesem Ansatz können Sie unter Android 2.1, 2.2 und 2.3 zeichnbare Teiler verwenden.

Beispielcode:

<android.support.v7.widget.LinearLayoutCompat
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:showDividers="middle"
        app:divider="@drawable/divider">

drawable / divider.xml: (Teiler mit etwas Polsterung oben und unten)

<?xml version="1.0" encoding="UTF-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:insetBottom="2dp"
        android:insetTop="2dp">
    <shape>
        <size android:width="1dp" />
        <solid android:color="#FFCCCCCC" />
    </shape>
</inset>

Sehr wichtiger Hinweis: Die LinearLayoutCompatAnsicht wird nicht erweitert LinearLayoutund daher sollten Sie nicht die Eigenschaften android:showDividersoder android:dividerverwenden, sondern die benutzerdefinierten: app:showDividersund app:divider. Im Code sollten Sie auch das LinearLayoutCompat.LayoutParamsnicht das LinearLayout.LayoutParams!

Rolf ツ
quelle
Ist dies die einzige Möglichkeit, einem Teiler eine vertikale Polsterung hinzuzufügen?
SARose
1
@SARose nein, Sie können jederzeit eine benutzerdefinierte Ansicht erstellen oder vorhandene Ansichtskomponenten hacken. Dies ist jedoch die Standard- und bevorzugte Methode, um dies zu tun.
Rolf
8

Ich bin heute auf dasselbe Problem gestoßen. Wie aus den vorherigen Antworten hervorgeht, beruht das Problem auf der Verwendung einer Farbe im Teiler-Tag und nicht auf einer Zeichnungsfarbe. Anstatt meine eigene zeichnbare XML zu schreiben, bevorzuge ich es jedoch, so oft wie möglich thematische Attribute zu verwenden. Sie können stattdessen android: attr / dividerHorizontal und android: attr / dividerVertical verwenden, um ein vordefiniertes Zeichen zu erhalten:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:showDividers="middle"
    android:divider="?android:attr/dividerVertical"
    android:orientation="horizontal">
    <!-- other views -->
</LinearLayout>

Die Attribute sind in API 11 und höher verfügbar.

Wie von bocekm in seiner Antwort erwähnt, fügt die Eigenschaft dividerPadding KEINE zusätzliche Polsterung auf beiden Seiten eines vertikalen Teilers hinzu, wie man annehmen könnte. Stattdessen definiert es die obere und untere Polsterung und kann daher den Teiler abschneiden, wenn er zu groß ist.

Nicolai Buch-Andersen
quelle
6

Sie können den eingebauten Teiler verwenden, dies funktioniert für beide Ausrichtungen.

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:divider="?android:attr/listDivider"
  android:orientation="horizontal"
  android:showDividers="middle">
Amilcar Andrade
quelle
3

Frustrierend ist, dass Sie die Anzeige der Trennlinien vom Code in Ihrer Aktivität aktivieren müssen. Beispielsweise:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the view to your layout
    setContentView(R.layout.yourlayout);

    // Find the LinearLayout within and enable the divider
    ((LinearLayout)v.findViewById(R.id.llTopBar)).
        setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);

}
Dougc
quelle
Obwohl es eine andere Art ist, gibt es keine Notwendigkeit.
Ricardo A.
2

Ihr Teiler wird möglicherweise aufgrund eines zu großen Teilers nicht angezeigt. Sie setzen 22dip, dh der Teiler wird von oben um 22dip und von unten um 22dip abgeschnitten. Wenn Ihre Layouthöhe kleiner oder gleich 44dip ist, ist kein Teiler sichtbar.

bocekm
quelle
1

Wenn die Antwort von Kapil Vats nicht funktioniert, versuchen Sie Folgendes:

drawable / divider_horizontal_green_22.xml

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

    <size android:width="22dip"/>
    <solid android:color="#00ff00"/>

</shape>

layout / your_layout.xml

LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/llTopBar"
            android:orientation="horizontal"
            android:divider="@drawable/divider_horizontal_green_22"
            android:showDividers="middle"
           >

Ich bin auf ein Problem gestoßen, bei dem das Auffüllattribut nicht funktioniert hat. Daher musste ich die Höhe des Teilers direkt im Teiler festlegen.

Hinweis:

Wenn Sie es in vertikalem LinearLayout verwenden möchten, erstellen Sie ein neues wie folgt : drawable / divider_vertical_green_22.xml

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

    <size android:height="22dip"/>
    <solid android:color="#00ff00"/>

</shape>
Ionut Negru
quelle
0

Um gezeichnet zu werden, LinearLayoutmuss der Teiler von eine gewisse Höhe haben, während ColorDrawable(was im Wesentlichen #00ff00genauso gut ist wie jede andere fest codierte Farbe) dies nicht der Fall ist. Eine einfache (und korrekte) Möglichkeit, dies zu lösen, besteht darin, Ihre Farbe in eine Farbe Drawablemit vordefinierter Höhe zu wickeln , z. B. zum shapeZeichnen

Dmitry Zaytsev
quelle
-1

Sie müssen eine beliebige Ansicht für ein Trennzeichen wie Textansicht oder Bildansicht erstellen und dann den Hintergrund dafür festlegen, wenn Sie ein Bild haben, andernfalls die Farbe als Hintergrund verwenden.

Hoffe das hilft dir.

itsrajesh4uguys
quelle