Bagaimana cara menambahkan pembagi (vertikal) ke LinearLayout horizontal?

94

Saya mencoba menambahkan pemisah ke tata letak linier horizontal tetapi tidak berhasil. Pembatasnya tidak terlihat. Saya benar-benar pemula dengan Android.

Ini adalah XML tata letak saya:

<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
sumber
Versi Android apa yang Anda gunakan untuk menjalankan ini? setDividerDrawable hanya ada sejak API 11
alex
jelly bean 4.2 api 17
Ahmed-Anas
Jika Anda telah mencoba yang lainnya, pastikan LinearLayout memiliki orientasi yang benar. Menetapkan ketinggian untuk pembatas dengan orientasi horizontal akan sangat membingungkan.
Nino van Hooff
1
jangan lupa item SHOWDIVIDERS yang menyebalkan !!!!!!
Fattie

Jawaban:

222

gunakan ini untuk pembatas horizontal

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

dan ini untuk pembatas vertikal

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

ATAU jika Anda dapat menggunakan pembagi LinearLayout, untuk pembagi 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>

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

Jika Anda ingin menggunakan pembagi vertikal maka di tempatkan android:height="1dp"di gunakanandroid:width="1dp"

Tip: Jangan lupa yang android:showDividersbarang.

Kapil Vats
sumber
3
Terima kasih. tapi bagaimana cara menambahkan ini ke atribut "android: divider"? pada dasarnya, yang saya maksud adalah, semacam cara otomatis untuk menambahkan pemisah antara setiap elemen? Bukankah itu sebabnya atribut android: divider ada?
Ahmed-Anas
@ death_relic0 android: pembagi tersedia untuk ListView, Listview yang Dapat Diperluas, dan TabWidget
Padma Kumar
9
terima kasih, tapi mengapa sekarang ada di sini: s developer.android.com/reference/android/widget/…
Ahmed-Anas
Tampaknya Anda harus menggunakan
drawable
7
Tampaknya Anda mendapatkan layout_widthdan layout_heightnilai - nilai Anda tercampur: untuk horizontal layout_widthharus "fill_parent"dan layout_heightseharusnya "1dp". Harus ditukar serupa untuk pembatas vertikal.
Jay Sidri
69

Coba ini, buat pembatas di res/drawablefolder:

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> 

Dan gunakan divideratribut di LinearLayout seperti ini:

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

Catatan: android:divider hanya tersedia di Android 3.0 (API level 11) atau lebih tinggi.

ShreeshaDas
sumber
tapi itu hanya akan menambah satu pemisah .. misalkan saya memiliki 10 elemen, menambahkan kode tambahan untuk pemisah antara setiap elemen sepertinya sia
Ahmed-Anas
@ death_relic0 Mengapa Anda tidak membuat tata letak terpisah untuk pemisah dan kemudian menggunakan tag include untuk menambahkannya di mana saja dan sebanyak yang Anda inginkan. Saya pikir ini akan membuat saya lebih baik dan tidak ada pemborosan.
GrIsHu
40

Sangat mudah untuk menambahkan pembagi ke tata letak, kami tidak memerlukan tampilan terpisah.

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

Kode di atas membuat pembatas vertikal untuk LinearLayout

Khai Nguyen
sumber
Saya selalu lupa atribut showDividers. Terima kasih!
Unknownweirdo
1
Terima kasih atas tip untuk menggunakan? Android: listDivider. Saya baru saja menyadari bahwa ini tidak terlihat di API 21 atau lebih tinggi. Dalam versi API yang lebih rendah garis abu-abu kecil ditampilkan
pengguna114676
@KetanMehta akan kita definisikan dengan atribut 'android: divider', drawable atau color.
Khai Nguyen
Apakah android: divider mendukung API 15 +?
RoCk RoCk
17

Memperbarui: pra-Honeycomb menggunakan AppCompat

Jika Anda menggunakan pustaka AppCompat v7, Anda mungkin ingin menggunakan LinearLayoutCompattampilan. Dengan menggunakan pendekatan ini, Anda dapat menggunakan pembagi drawable di Android 2.1, 2.2, dan 2.3.

Kode contoh:

<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: (pembagi dengan beberapa padding di bagian atas dan bawah)

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

Sangat catatan penting: The LinearLayoutCompatview tidak memperpanjang LinearLayoutdan untuk itu Anda tidak harus menggunakan android:showDividersatau android:dividerproperti tapi yang kustom: app:showDividersdan app:divider. Dalam kode, Anda juga harus menggunakan LinearLayoutCompat.LayoutParamsbukan LinearLayout.LayoutParams!

Rolf ツ
sumber
Apakah ini satu-satunya cara untuk menambahkan bantalan vertikal ke pembatas?
SARose
1
@SARose tidak, Anda selalu dapat membuat tampilan kustom atau meretas ke dalam komponen tampilan yang ada. Namun ini adalah metode default dan pilihan untuk melakukannya.
Rolf ツ
8

Saya baru saja mengalami masalah yang sama hari ini. Seperti yang ditunjukkan oleh jawaban sebelumnya, masalahnya berasal dari penggunaan warna pada tag pembagi, bukan dari drawable. Namun, daripada menulis xml drawable saya sendiri, saya lebih suka menggunakan atribut bertema sebanyak mungkin. Anda bisa menggunakan android: attr / dividerHorizontal dan android: attr / dividerVertical untuk mendapatkan drawable yang sudah ditentukan sebelumnya:

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

Atribut tersedia di API 11 ke atas.

Juga, seperti yang disebutkan oleh bocekm dalam jawabannya, properti dividerPadding TIDAK menambahkan bantalan ekstra di kedua sisi pembagi vertikal, seperti yang bisa diasumsikan. Sebaliknya itu mendefinisikan bantalan atas dan bawah dan dengan demikian dapat memotong pembatas jika terlalu besar.

Nicolai Buch-Andersen
sumber
6

Anda dapat menggunakan pembagi bawaan, ini akan berfungsi untuk kedua orientasi.

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

Dengan frustrasi, Anda harus mengaktifkan menampilkan pemisah dari kode dalam aktivitas Anda. Sebagai contoh:

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
sumber
Meskipun itu cara lain untuk melakukannya, tidak perlu.
Ricardo A.
2

Pembatas Anda mungkin tidak muncul karena pembatas yang terlalu besar. Anda menyetel 22dip, itu berarti pembatas dipotong oleh 22dip dari atas dan 22dip dari bawah. Jika tinggi tata letak Anda kurang dari atau sama dengan 44dip, maka tidak ada pembatas yang terlihat.

bocekm
sumber
1

Jika jawaban Kapil Vats tidak berfungsi coba sesuatu seperti ini:

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

Saya mengalami masalah di mana atribut padding tidak berfungsi, jadi saya harus mengatur ketinggian pembatas langsung di pembatas.

catatan:

Jika Anda ingin menggunakannya dalam LinearLayout vertikal, buat yang baru, seperti ini: 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
sumber
0

Untuk dapat digambar, pembagi LinearLayoutharus memiliki ketinggian sementara ColorDrawable(yang pada dasarnya #00ff00sama seperti warna hardcode lainnya) tidak memiliki. Cara sederhana (dan benar) untuk menyelesaikan ini, adalah membungkus warna Anda menjadi beberapa Drawabledengan ketinggian yang telah ditentukan, seperti shapedrawable

Dmitry Zaytsev
sumber
-1

Anda harus membuat tampilan untuk pemisah seperti textview atau imageview kemudian mengatur latar belakang untuk itu jika Anda memiliki gambar lain gunakan warna sebagai latar belakang.

Semoga ini bisa membantu Anda.

itsrajesh4uguys
sumber