Come aggiungere un divisore (verticale) a un LinearLayout orizzontale?


92

Sto cercando di aggiungere un divisore a un layout lineare orizzontale ma non sto arrivando da nessuna parte. Il divisore semplicemente non viene visualizzato. Sono un principiante totale con Android.

Questo è il mio 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>

Su quale versione di Android stai eseguendo questo? setDividerDrawable esiste solo dall'API 11
alex

jelly bean 4.2 api 17
Ahmed-Anas

Se hai provato tutto il resto, assicurati che LinearLayout abbia l'orientamento corretto. L'impostazione di un'altezza per un divisore con un orientamento orizzontale sarà molto confusa.
Nino van Hooff

1
non dimenticare la voce esasperante SHOWDIVIDERS !!!!!!
Fattie

Risposte:


217

usalo per il divisore orizzontale

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

e questo per il divisore verticale

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

OPPURE se puoi usare il divisore LinearLayout, per il divisore orizzontale

<?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>

e 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" >

Se si desidera utilizzare un divisore verticale, al posto della android:height="1dp"forma utilizzareandroid:width="1dp"

Suggerimento: non dimenticare l' android:showDividersoggetto.


3
Grazie. ma come lo aggiungerò all'attributo "android: divider"? in pratica, quello che voglio dire è, un modo automatico tipo per aggiungere il divisore tra ogni elemento? Voglio dire, non è per questo che è presente l'attributo android: divider?
Ahmed-Anas

@ death_relic0 android: divider è disponibile per ListView, Listview espandibile e TabWidget
Padma Kumar

9
grazie, ma perché è qui allora: s developer.android.com/reference/android/widget/…
Ahmed-Anas

Sembra che dovresti usare qualsiasi disegno, non il colore
demaksee

7
Sembra che tu hai i tuoi layout_widthe layout_heightvalori confusi: per orizzontale layout_widthdovrebbe essere "fill_parent"e layout_heightdovrebbe essere "1dp". Dovrebbe essere scambiato allo stesso modo per il divisore verticale.
Jay Sidri

69

Prova questo, crea un divisore nella res/drawablecartella:

vertical_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> 

E usa l' dividerattributo in LinearLayout in questo modo:

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

Nota: android:divider è disponibile solo in Android 3.0 (livello API 11) o versioni successive.


ma questo aggiungerà solo un divisore .. supponiamo di avere tipo 10 elementi, l'aggiunta di codice aggiuntivo per un divisore tra ogni elemento sembra uno spreco
Ahmed-Anas

@ death_relic0 Perché non crei un layout separato per il divisore e poi usi il tag include per aggiungerlo ovunque e tutte le volte che vuoi. Penso che questo mi farebbe meglio di più e senza sprechi.
GrIsHu

39

È facile aggiungere un divisore al layout, non abbiamo bisogno di una vista separata.

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

Il codice sopra crea un divisore verticale per LinearLayout


Dimentico sempre l'attributo showDividers. Grazie!
Unknownweirdo

1
Grazie per il suggerimento di utilizzare? Android: listDivider. Ho appena notato però che questo è invisibile nell'API 21 o superiore. Nelle versioni API inferiori viene mostrata una piccola linea grigia
user114676

@KetanMehta lo definiremo con l'attributo "android: divider", è disegnabile o colorato.
khaintt

Android: divider supporta l'API 15 +?
RoCk RoCk

16

Aggiornamento: pre-Honeycomb utilizzando AppCompat

Se stai usando la libreria AppCompat v7 potresti voler usare la LinearLayoutCompatvista. Usando questo approccio puoi usare divisori disegnabili su Android 2.1, 2.2 e 2.3.

Codice di esempio:

<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: (divisore con imbottitura in alto e in basso)

<?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>

Nota molto importante: la LinearLayoutCompatvista non si estende LinearLayoute quindi non dovresti usare le proprietà android:showDividerso android:dividerma quelle personalizzate: app:showDividerse app:divider. Nel codice dovresti anche usare il LinearLayoutCompat.LayoutParamsnon il LinearLayout.LayoutParams!


Questo è l'unico modo per aggiungere imbottitura verticale a un divisore?
SARose

1
@SARose no, puoi sempre creare una visualizzazione personalizzata o hackerare i componenti di visualizzazione esistenti. Questo è tuttavia il metodo predefinito e preferito per farlo.
Rolf ツ

8

Oggi mi sono imbattuto nello stesso problema. Come indicano le risposte precedenti, il problema deriva dall'uso di un colore nel tag divisore, piuttosto che un disegnabile. Tuttavia, invece di scrivere il mio xml disegnabile, preferisco utilizzare il più possibile attributi a tema. Puoi utilizzare android: attr / dividerHorizontal e android: attr / dividerVertical per ottenere invece un drawable predefinito:

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

Gli attributi sono disponibili in API 11 e versioni successive.

Inoltre, come menzionato da bocekm nella sua risposta, la proprietà dividerPadding NON aggiunge imbottitura extra su entrambi i lati di un divisore verticale, come si potrebbe supporre. Invece definisce il riempimento superiore e inferiore e quindi può troncare il divisore se è troppo grande.


6

Puoi usare il divisore integrato, funzionerà per entrambi gli orientamenti.

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

3

In modo frustrante, devi abilitare la visualizzazione dei divisori dal codice nella tua attività. Per esempio:

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

}

Sebbene sia un altro modo per farlo, non ce n'è bisogno.
Ricardo A.

2

Il tuo divisore potrebbe non essere visualizzato a causa di dividerPadding troppo grande. Si imposta 22dip, il che significa che il divisore viene troncato di 22dip dall'alto e di 22dip dal basso. Se l'altezza del layout è inferiore o uguale a 44dip, non è visibile alcun divisore.


1

Se la risposta di Kapil Vats non funziona, prova qualcosa del genere:

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"
           >

Ho riscontrato un problema in cui l'attributo padding non funzionava, quindi ho dovuto impostare l'altezza del divisore direttamente nel divisore.

Nota:

Se vuoi usarlo in LinearLayout verticale, creane uno nuovo, come questo: 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>

0

Per essere disegnato, il divisore di LinearLayoutdeve avere una certa altezza mentre ColorDrawable(che è essenzialmente #00ff00come qualsiasi altro colore codificato) non ha. Un modo semplice (e corretto) per risolvere questo problema è avvolgere il tuo colore in alcuni Drawablecon un'altezza predefinita, come il shapedrawable


-1

Devi creare qualsiasi vista per separatore come textview o imageview, quindi impostare lo sfondo per quello se hai un'immagine altrimenti usa il colore come sfondo.

Spero che questo ti aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.