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

Я пытаюсь добавить разделитель в горизонтальную линейную компоновку, но не получаю никуда. Делитель просто не показывает. Я новичок в 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>

Ответ 1

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

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

Ответ 2

Попробуйте это, создайте разделитель в папке 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) или выше.

Ответ 3

Легко добавить разделитель в макет, нам не нужно отдельное представление.

<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

Ответ 4

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

Если вы используете библиотеку V7 AppCompat, вы можете использовать представление 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/divider.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.LayoutParams не LinearLayout.LayoutParams!

Ответ 5

Сегодня я столкнулся с одной и той же проблемой. Как показывают предыдущие ответы, проблема связана с использованием цвета в теге делителя, а не с возможностью рисования. Однако вместо того, чтобы писать свой собственный drawable xml, я предпочитаю использовать эти атрибуты как можно больше. Вы можете использовать андроид: 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">

Ответ 7

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

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

}

Ответ 8

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

Ответ 9

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

Ответ 10

Вы можете использовать IcsLinearLayout, как это используется в библиотеке ActionBarSherlock, или использовать обычный API, который доступен на ICS (или скопировать его код).

EDIT: вы также можете использовать LinearLayoutICS, который используется в библиотеке поддержки. Я сделал сообщение об этом здесь.

Вы можете использовать тот же метод для создания drawable, как показано здесь, или создать 9-патч.

Ответ 11

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

вытяжка /divider _horizontal_green_22.xml     

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

</shape>

макет /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, создайте новый, например: вытяжке /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>

Ответ 12

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

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