Как добавить (вертикальный) разделитель к горизонтальному LinearLayout?

94

Я пытаюсь добавить разделитель в горизонтальный линейный макет, но ничего не добился. Разделитель просто не отображается. Я новичок в Android.

Это мой 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>
Ахмед-Анас
источник
На какой версии Android вы это используете? setDividerDrawable существует только с API 11
Алекс
jelly bean 4.2 api 17
Ахмед-Анас
Если вы пробовали все остальное, убедитесь, что LinearLayout имеет правильную ориентацию. Установка высоты разделителя с горизонтальной ориентацией будет очень запутанной.
Нино ван Хофф
1
не забывайте приводить в бешенство SHOWDIVIDERS !!!!!!
Fattie

Ответы:

222

используйте это для горизонтального разделителя

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

и это для вертикального разделителя

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

ИЛИ, если вы можете использовать разделитель LinearLayout для горизонтального разделителя

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

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

Если вы хотите использовать вертикальный разделитель, вместо android:height="1dp"формы используйтеandroid:width="1dp"

Совет: Не стоит забывать о android:showDividersпункте.

Капил Чан
источник
3
Спасибо. но как мне добавить это в атрибут "android: divider"? в основном, я имею в виду какой-то автоматический способ добавить разделитель между каждым элементом? Я имею в виду, разве нет атрибута android: divider?
Ахмед-Анас,
@ death_relic0 android: divider доступен для ListView, Expandable Listview и TabWidget
Падма Кумар
9
спасибо, но тогда почему он здесь: s developer.android.com/reference/android/widget/…
Ахмед-Анас,
Похоже, вам следует использовать любой рисунок, а не цвет
demaksee
7
Кажется , вы получили ваши layout_widthи layout_heightзначения перепутаны: для горизонтального layout_widthдолжны быть "fill_parent"и layout_heightдолжно быть "1dp". Аналогичным образом следует поменять местами вертикальный разделитель.
Jay Sidri
69

Попробуйте так, создайте разделитель в res/drawableпапке:

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> 

И используйте dividerатрибут LinearLayout следующим образом:

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

Примечание: android:divider доступно только в Android 3.0 (уровень API 11) или выше.

ShreeshaDas
источник
но это просто добавит один разделитель .. Предположим, у меня есть примерно 10 элементов, добавление дополнительного кода для разделителя между каждым элементом кажется пустой тратой
Ахмед-Анас
@ death_relic0 Почему бы вам не создать отдельный макет для разделителя, а затем использовать тег include, чтобы добавить его в любом месте и столько раз, сколько захотите. Я думаю, это было бы мне лучше и без лишних затрат.
GrIsHu
40

Добавить разделитель в макет легко, нам не нужен отдельный вид.

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

Над кодом сделайте вертикальный разделитель для LinearLayout

Хай Нгуен
источник
Я всегда забываю об атрибуте showDividers. Спасибо!
Unknownweirdo
1
Спасибо за совет по использованию? Android: listDivider. Я только заметил, что это невидимо в API 21 или выше. В более низких версиях API отображается небольшая серая линия
user114676
@KetanMehta мы определим его с помощью атрибута android: divider, его можно рисовать или цвета.
Хай Нгуен
Поддерживает ли android: divider API 15+?
RoCk RoCk 01
17

Обновление: pre-Honeycomb с использованием AppCompat

Если вы используете библиотеку AppCompat v7, возможно, вы захотите использовать LinearLayoutCompatпредставление. Используя этот подход, вы можете использовать выдвижные разделители на Android 2.1, 2.2 и 2.3.

Пример кода:

<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 / diverr.xml: (разделитель с отступом сверху и снизу)

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

Очень важное замечание:LinearLayoutCompat вид не распространяется , LinearLayoutи для этого вы не должны использовать android:showDividersили android:dividerсвойства , но пользовательские из них: app:showDividersа app:divider. В коде также следует использовать символ LinearLayoutCompat.LayoutParamsnot LinearLayout.LayoutParams!

Рольф ツ
источник
Это единственный способ добавить вертикальный отступ к разделителю?
SARose
1
@SARose нет, вы всегда можете создать собственное представление или взломать существующие компоненты представления. Однако это предпочтительный и предпочтительный метод по умолчанию.
Рольф ツ
8

Я столкнулся с той же проблемой сегодня. Как показывают предыдущие ответы, проблема связана с использованием цвета в теге разделителя, а не с возможностью рисования. Однако вместо того, чтобы писать свой собственный XML-код с возможностью рисования, я предпочитаю как можно больше использовать тематические атрибуты. Вы можете использовать android: attr / dividerHorizontal и android: attr / dividerVertical, чтобы вместо этого получить предопределенный объект для рисования:

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

Атрибуты доступны в API 11 и выше.

Кроме того, как упоминал bocekm в своем ответе, свойство dividerPadding НЕ добавляет дополнительных отступов по обе стороны от вертикального разделителя, как можно было бы предположить. Вместо этого он определяет верхнее и нижнее отступы и, таким образом, может обрезать разделитель, если он слишком велик.

Николай Бух-Андерсен
источник
6

Вы можете использовать встроенный разделитель, он будет работать для обеих ориентаций.

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:divider="?android:attr/listDivider"
  android:orientation="horizontal"
  android:showDividers="middle">
Амилкар Андраде
источник
3

К сожалению, вы должны включить отображение разделителей кода в своей деятельности. Например:

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
источник
Хотя это другой способ сделать это, в этом нет необходимости.
Ricardo A.
2

Ваш разделитель может не отображаться из-за слишком большого размера dividerPadding. Вы устанавливаете 22dip, это означает, что разделитель усекается на 22dip сверху и на 22dip снизу. Если высота вашего макета меньше или равна 44dip, разделитель не отображается.

Bocekm
источник
1

Если ответ Kapil Vats не работает, попробуйте что-то вроде этого:

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

Я столкнулся с проблемой, когда атрибут заполнения не работал, поэтому мне пришлось установить высоту разделителя непосредственно в разделителе.

Заметка:

Если вы хотите использовать его в вертикальном LinearLayout, создайте новый, например: 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

Чтобы его можно было нарисовать, разделитель LinearLayoutдолжен иметь некоторую высоту, в то время как ColorDrawable(которая, по сути, #00ff00так же, как и любой другой жестко заданный цвет) не имеет. Простой (и правильный) способ решить эту проблему - обернуть ваш цвет в некоторые Drawableс заранее определенной высотой, например, с возможностью shapeрисования.

Дмитрий Зайцев
источник
-1

Вы должны создать любое представление для разделителя, такого как textview или imageview, затем установить для него фон, если у вас есть изображение, иначе используйте цвет в качестве фона.

Надеюсь, это тебе поможет.

itsrajesh4uguys
источник