Jak dodać (pionową) separator do poziomego LinearLayout?

93

Próbuję dodać separator do poziomego układu liniowego, ale nic nie robię. Separator po prostu się nie pokazuje. Jestem zupełnym nowicjuszem z Androidem.

To jest mój XML układu:

<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
źródło
Na jakiej wersji Androida to działa? setDividerDrawable istnieje dopiero od API 11
alex
Jelly Bean 4.2 api 17
Ahmed-Anas
Jeśli wypróbowałeś wszystko inne, upewnij się, że LinearLayout ma prawidłową orientację. Ustawienie wysokości przegrody w orientacji poziomej będzie bardzo mylące.
Nino van Hooff
1
nie zapomnij o irytującej pozycji SHOWDIVIDERS !!!!!!
Fattie

Odpowiedzi:

221

użyj tego do rozdzielacza poziomego

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

i to dla przegrody pionowej

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

LUB, jeśli możesz użyć separatora LinearLayout, do podziału poziomego

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

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

Jeśli chcesz android:height="1dp"użyć pionowej przegrody, użyj zamiast kształtuandroid:width="1dp"

Wskazówka: nie zapomnij o android:showDividerselemencie.

Kapil Vats
źródło
3
dzięki. ale jak mam to dodać do atrybutu „android: divider”? zasadniczo chodzi mi o to, że jakiś automatyczny sposób dodawania separatora między każdym elementem? Chodzi mi o to, czy nie dlatego jest tam atrybut android: divider?
Ahmed-Anas
@ death_relic0 android: divider jest dostępny dla ListView, Expandable Listview i TabWidget
Padma Kumar
9
dzięki, ale dlaczego to tutaj jest: s developer.android.com/reference/android/widget/…
Ahmed-Anas
Wygląda na to, że powinieneś użyć dowolnego elementu do rysowania, a nie koloru
zobacz
7
Wygląda na to, że pomieszałeś swoje layout_widthi layout_heightwartości: horyzontalnie layout_widthpowinno być "fill_parent"i layout_heightpowinno być "1dp". Powinien być zamieniony podobnie w przypadku przegrody pionowej.
Jay Sidri
69

Spróbuj tego, utwórz separator w res/drawablefolderze:

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> 

I użyj divideratrybutu w LinearLayout w ten sposób:

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

Uwaga: android:divider jest dostępny tylko w systemie Android 3.0 (poziom API 11) lub nowszym.

ShreeshaDas
źródło
ale to po prostu doda jeden dzielnik ... przypuśćmy, że mam jakieś 10 elementów, dodanie dodatkowego kodu rozdzielacza między każdym elementem wydaje się marnotrawstwem
Ahmed-Anas
@ death_relic0 Dlaczego nie utworzysz oddzielnego układu dla separatora, a następnie użyjesz tagu include, aby dodać go w dowolnym miejscu i tyle razy, ile chcesz. Myślę, że to byłoby lepsze i bez marnotrawstwa.
GrIsHu
40

Łatwo jest dodać separator do układu, nie potrzebujemy osobnego widoku.

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

Powyższy kod tworzy pionową separator dla LinearLayout

Khai Nguyen
źródło
Zawsze zapominam o atrybucie showDividers. Dziękuję Ci!
Unknownweirdo
1
Dzięki za wskazówkę dotyczącą używania? Android: listDivider. Właśnie zauważyłem, że jest to niewidoczne w API 21 lub nowszym. W niższych wersjach API wyświetlana jest mała szara linia
user114676
@KetanMehta zdefiniujemy go za pomocą atrybutu „android: divider”, można go rysować lub kolorować.
Khai Nguyen
Czy android: divider obsługuje API 15 +?
RoCk RoCk
17

Aktualizacja: pre-Honeycomb przy użyciu AppCompat

Jeśli używasz biblioteki AppCompat v7, możesz chcieć użyć LinearLayoutCompat widoku. Korzystając z tego podejścia, możesz użyć rysowalnych separatorów w systemie Android 2.1, 2.2 i 2.3.

Przykładowy kod:

<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: ( separator z dopełnieniem na górze i na dole)

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

Bardzo ważna uwaga:LinearLayoutCompat widok nie rozciąga LinearLayouti do nich nie należy używać android:showDividersani android:dividerwłaściwości ale te niestandardowe: app:showDividersa app:divider. W kodzie należy również użyć LinearLayoutCompat.LayoutParamsnot LinearLayout.LayoutParams!

Rolf ツ
źródło
Czy to jedyny sposób na dodanie dopełnienia pionowego do separatora?
SARose
1
@SARose nie, zawsze możesz utworzyć własny widok lub włamać się do istniejących składników widoku. Jest to jednak domyślna i preferowana metoda.
Rolf ツ
8

Właśnie dzisiaj napotkałem ten sam problem. Jak wskazują poprzednie odpowiedzi, problem wynika z zastosowania koloru w tagu rozdzielacza, a nie z elementu rysunkowego. Jednak zamiast pisać własny plik XML do rysowania, wolę używać atrybutów tematycznych tak często, jak to możliwe. Możesz użyć android: attr / dividerHorizontal i android: attr / dividerVertical, aby zamiast tego uzyskać predefiniowany element do rysowania:

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

Atrybuty są dostępne w API 11 i nowszych.

Ponadto, jak wspomniał bocekm w swojej odpowiedzi, właściwość dividerPadding NIE dodaje dodatkowego wypełnienia po obu stronach pionowego separatora, jak można by przypuszczać. Zamiast tego definiuje dopełnienie górne i dolne, co może spowodować obcięcie rozdzielacza, jeśli jest zbyt duży.

Nicolai Buch-Andersen
źródło
6

Możesz użyć wbudowanego rozdzielacza, będzie to działać dla obu orientacji.

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:divider="?android:attr/listDivider"
  android:orientation="horizontal"
  android:showDividers="middle">
Amilcar Andrade
źródło
3

Frustrujące jest to, że musisz włączyć wyświetlanie separatorów od kodu w swojej aktywności. Na przykład:

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
źródło
Chociaż jest to inny sposób, nie ma takiej potrzeby.
Ricardo A.
2

Twój element dzielący może nie być wyświetlany z powodu zbyt dużego podziału. Ustawiasz 22dip, co oznacza, że ​​dzielnik jest obcięty o 22dip od góry i 22dip od dołu. Jeśli wysokość układu jest mniejsza lub równa 44 dip, wówczas nie jest widoczny żaden element rozdzielający.

bocekm
źródło
1

Jeśli odpowiedź Kapil Vats nie działa, spróbuj czegoś takiego:

do rysowania / dzielnik_poziome_zielony_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>

układ / 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"
           >

Napotkałem problem polegający na tym, że atrybut wypełnienia nie działał, dlatego musiałem ustawić wysokość separatora bezpośrednio w separatorze.

Uwaga:

Jeśli chcesz go użyć w pionowym LinearLayout, utwórz nowy, na przykład: 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
źródło
0

Aby zostać narysowanym, dzielnik LinearLayoutmusi mieć pewną wysokość, podczas gdy ColorDrawable(która jest zasadniczo #00ff00tak samo dobra, jak każdy inny zakodowany kolor) nie ma. Prostym (i poprawnym) sposobem rozwiązania tego problemu jest zawinięcie koloru w niektóre Drawablez predefiniowaną wysokością, na przykład do shaperysowania

Dmitry Zaytsev
źródło
-1

Musisz utworzyć dowolny widok dla separatora, taki jak widok tekstu lub widok obrazu, a następnie ustawić tło dla tego, jeśli masz obraz, w innym przypadku użyj koloru jako tła.

Mam nadzieję, że to ci pomoże.

itsrajesh4uguys
źródło