Como adicionar divisor (vertical) a um LinearLayout horizontal?

92

Estou tentando adicionar uma divisória a um layout linear horizontal, mas não estou chegando a lugar nenhum. O divisor simplesmente não aparece. Eu sou um novato total no Android.

Este é o meu 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
fonte
Em qual versão do Android você está executando isso? setDividerDrawable só existe desde API 11
alex de
jujuba 4.2 api 17
Ahmed-Anas
Se você já tentou de tudo, certifique-se de que o LinearLayout tenha a orientação correta. Definir uma altura para um divisor com orientação horizontal pode ser muito confuso.
Nino van Hooff
1
não se esqueça do irritante item SHOWDIVIDERS !!!!!!
Fattie

Respostas:

217

use isso para divisor horizontal

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

e isso para divisor vertical

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

OU se você pode usar o divisor LinearLayout, para divisor horizontal

<?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 em 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 você quiser usar o divisor vertical, em vez de android:height="1dp"usar a formaandroid:width="1dp"

Dica: não se esqueça do android:showDividersitem.

Kapil Vats
fonte
3
obrigado. mas como adicionarei isso ao atributo "android: divider"? basicamente, o que quero dizer é alguma forma automática de adicionar o divisor entre cada elemento? Quer dizer, não é por isso que o atributo android: divider está lá?
Ahmed-Anas
@ death_relic0 android: divider está disponível para ListView, ListView expansível e TabWidget
Padma Kumar
9
obrigado, mas por que está aqui então: s developer.android.com/reference/android/widget/…
Ahmed-Anas
Parece que você deve usar qualquer drawable, não color
demaksee
7
Parece que você confundiu seus valores layout_widthe layout_height: pois horizontal layout_widthdeveria ser "fill_parent"e layout_heightdeveria ser "1dp". Deve ser trocado da mesma forma para o divisor vertical.
Jay Sidri
69

Experimente isso, crie um divisor na res/drawablepasta:

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 use o divideratributo em LinearLayout assim:

<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 só está disponível no Android 3.0 (API de nível 11) ou superior.

ShreeshaDas
fonte
mas isso apenas adicionará um divisor ... suponha que eu tenha cerca de 10 elementos, adicionar código adicional para um divisor entre cada elemento parece um desperdício
Ahmed-Anas
@ death_relic0 Por que você não cria um layout separado para o divisor e, em seguida, usa a tag include para adicioná-lo em qualquer lugar e quantas vezes quiser. Acho que isso me faria melhor mais e sem desperdício.
GrIsHu
39

É fácil adicionar divisória ao layout, não precisamos de uma visualização separada.

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

O código acima faz divisor vertical para LinearLayout

khaintt
fonte
Sempre esqueço o atributo showDividers. Obrigado!
Unknownweirdo,
1
Obrigado pela dica de usar? Android: listDivider. Acabei de notar que isso é invisível na API 21 ou superior. Em versões anteriores da API, uma pequena linha cinza é exibida
user114676
@KetanMehta vamos defini-lo com o atributo 'android: divider', é drawable ou cor.
khaintt
O android: divider é compatível com API 15 +?
RoCk RoCk
16

Atualização: pré-Honeycomb usando AppCompat

Se você estiver usando a biblioteca AppCompat v7, talvez queira usar a LinearLayoutCompatvisualização. Usando essa abordagem, você pode usar divisores drawable no Android 2.1, 2.2 e 2.3.

Código de exemplo:

<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: (divisor com algum preenchimento na parte superior e inferior)

<?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 muito importante: A LinearLayoutCompatvisualização não se estende LinearLayoute, portanto, você não deve usar as propriedades android:showDividersou android:divider, mas as personalizadas: app:showDividerse app:divider. No código, você também deve usar o, LinearLayoutCompat.LayoutParamsnão o LinearLayout.LayoutParams!

Rolf ツ
fonte
Essa é a única maneira de adicionar preenchimento vertical a uma divisória?
SARose
1
@SARose não, você sempre pode criar uma visão customizada ou hackear componentes de visão existentes. No entanto, este é o método padrão e preferido para fazê-lo.
Rolf ツ
8

Acabei de ter o mesmo problema hoje. Como as respostas anteriores indicam, o problema decorre do uso de uma cor na tag divisória, ao invés de um drawable. No entanto, em vez de escrever meu próprio xml drawable, prefiro usar atributos temáticos tanto quanto possível. Você pode usar android: attr / dividerHorizontal e android: attr / dividerVertical para obter um drawable predefinido:

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

Os atributos estão disponíveis na API 11 e superior.

Além disso, conforme mencionado por bocekm em sua resposta, a propriedade dividerPadding NÃO adiciona preenchimento extra em ambos os lados de uma divisória vertical, como se poderia supor. Em vez disso, ele define o preenchimento superior e inferior e, portanto, pode truncar o divisor se for muito grande.

Nicolai Buch-Andersen
fonte
6

Você pode usar o divisor embutido, isso funcionará para ambas as orientações.

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

Frustrantemente, você precisa habilitar a exibição dos divisores do código em sua atividade. Por exemplo:

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
fonte
Embora seja outra maneira de fazer isso, não há necessidade.
Ricardo A.
2

Seu divisor pode não estar aparecendo devido a um padding divisor muito grande. Você define 22dip, o que significa que o divisor é truncado por 22dip da parte superior e por 22dip da parte inferior. Se a altura de seu layout for menor ou igual a 44dip, nenhum divisor estará visível.

bocekm
fonte
1

Se a resposta do Kapil Vats não estiver funcionando, tente algo assim:

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

Encontrei um problema em que o atributo de preenchimento não estava funcionando, portanto, tive que definir a altura do divisor diretamente no divisor.

Nota:

Se você quiser usá-lo em LinearLayout vertical, faça um novo, como este: 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
fonte
0

Para ser desenhado, o divisor de LinearLayoutdeve ter alguma altura enquanto ColorDrawable(que é essencialmente #00ff00tão boa quanto qualquer outra cor codificada) não tem. Uma maneira simples (e correta) de resolver isso é envolver sua cor em alguma Drawablecom altura predefinida, como shapedrawable

Dmitry Zaytsev
fonte
-1

Você tem que criar qualquer visualização para separadores como visualização de texto ou visualização de imagem e então definir o fundo para isso, se você tiver uma imagem, use a cor como fundo.

Espero que isso ajude você.

itsrajesh4uguys
fonte