Làm cách nào để thêm dải phân cách (dọc) vào LinearLayout ngang?


92

Tôi đang cố gắng thêm một dải phân cách vào một bố cục tuyến tính ngang nhưng chẳng đi đến đâu. Dải phân cách không hiển thị. Tôi là một người mới hoàn toàn với Android.

Đây là XML bố cục của tôi:

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

Bạn đang chạy phiên bản Android nào? setDividerDrawable chỉ tồn tại kể từ API 11
alex

Jelly bean 4.2 api 17
Ahmed-Anas

Nếu bạn đã thử mọi cách khác, hãy đảm bảo LinearLayout có hướng chính xác. Đặt chiều cao cho dải phân cách có hướng nằm ngang sẽ rất khó hiểu.
Nino van Hooff

1
đừng quên mục SHOWDIVIDERS tức giận !!!!!!
Fattie

Câu trả lời:


217

sử dụng cái này cho dải phân cách ngang

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

và cái này cho dải phân cách dọc

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

HOẶC nếu bạn có thể sử dụng dải phân cách LinearLayout, cho dải phân cách ngang

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

và trong 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" >

Nếu bạn muốn sử dụng dải phân cách dọc thì thay vì android:height="1dp"sử dụng hình dạngandroid:width="1dp"

Mẹo: Đừng quên các android:showDividersmục.


3
cảm ơn. nhưng làm cách nào để thêm điều này vào thuộc tính "android: divider"? về cơ bản, ý tôi là, một cách tự động nào đó để thêm dải phân cách giữa mỗi phần tử? Ý tôi là không phải tại sao lại có thuộc tính android: divider?
Ahmed-Anas

@ death_relic0 android: dải phân cách Avil cho ListView, mở rộng listview và TabWidget
Padma Kumar

9
cảm ơn, nhưng tại sao nó lại ở đây sau đó: s developer.android.com/reference/android/widget/…
Ahmed-Anas

Có vẻ như bạn nên sử dụng bất kỳ drawable, không màu
demaksee

7
Có vẻ như bạn đã trộn lẫn các giá trị layout_widthvà của mình layout_height: đối với chiều ngang layout_widthphải là "fill_parent"layout_heightnên có "1dp". Nên đổi chỗ tương tự cho dải phân cách dọc.
Jay Sidri

69

Hãy thử điều này, tạo một dải phân cách trong res/drawablethư mục:

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> 

Và sử dụng dividerthuộc tính trong LinearLayout như sau:

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

Lưu ý: android:divider chỉ khả dụng trong Android 3.0 (API cấp 11) trở lên.


nhưng điều đó sẽ chỉ thêm một dải phân cách .. giả sử tôi có 10 phần tử, việc thêm mã bổ sung cho một dải phân cách giữa mỗi phần tử có vẻ như lãng phí
Ahmed-Anas

@ death_relic0 Tại sao bạn không tạo một bố cục riêng cho dải phân cách và sau đó sử dụng thẻ include để thêm nó vào bất cứ đâu và bao nhiêu lần bạn muốn. Tôi nghĩ điều này sẽ giúp tôi tốt hơn và không lãng phí.
GrIsHu

39

Rất dễ dàng để thêm bộ chia vào bố cục, chúng ta không cần một chế độ xem riêng biệt.

<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ạn mã trên tạo dải phân cách dọc cho LinearLayout


Tôi luôn quên thuộc tính showDividers. Cảm ơn bạn!
Unknownweirdo

1
Cảm ơn vì mẹo sử dụng? Android: listDivider. Tôi chỉ nhận thấy rằng điều này là ẩn trong API 21 hoặc cao hơn. Trong các phiên bản API thấp hơn, một dòng nhỏ màu xám được hiển thị
user114676

@KetanMehta, chúng tôi sẽ xác định nó bằng thuộc tính 'android: divider', nó có thể vẽ hoặc màu.
khaintt

Android: divider có hỗ trợ API 15 + không?
RoCk RoCk

17

Cập nhật: pre-Honeycomb bằng AppCompat

Nếu bạn đang sử dụng thư viện AppCompat v7, bạn có thể muốn sử dụng LinearLayoutCompatchế độ xem. Sử dụng phương pháp này, bạn có thể sử dụng các bộ chia có thể kéo được trên Android 2.1, 2.2 và 2.3.

Mã ví dụ:

<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: (dải phân cách với một số phần đệm ở trên và dưới)

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

Rất lưu ý quan trọng: Các LinearLayoutCompatquan điểm không mở rộng LinearLayoutvà do bạn không nên sử dụng android:showDividershoặc android:dividerthuộc tính nhưng những tùy chỉnh: app:showDividersapp:divider. Trong mã, bạn cũng nên sử dụng LinearLayoutCompat.LayoutParamskhông phải LinearLayout.LayoutParams!


Đây có phải là cách duy nhất để thêm đệm dọc vào dải phân cách không?
SARose

1
@SARose không, bạn luôn có thể tạo chế độ xem tùy chỉnh hoặc xâm nhập vào các thành phần chế độ xem hiện có. Tuy nhiên, đây là phương pháp mặc định và được ưu tiên để thực hiện.
Rolf ツ

8

Tôi vừa gặp phải vấn đề tương tự ngày hôm nay. Như các câu trả lời trước đã chỉ ra, vấn đề bắt nguồn từ việc sử dụng màu trong thẻ chia, thay vì màu có thể vẽ được. Tuy nhiên, thay vì viết xml có thể vẽ của riêng mình, tôi thích sử dụng các thuộc tính theo chủ đề càng nhiều càng tốt. Thay vào đó, bạn có thể sử dụng android: attr / dividerHorizontal và android: attr / dividerVertical để có được một drawable được xác định trước:

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

Các thuộc tính có sẵn trong API 11 trở lên.

Ngoài ra, như đã được bocekm đề cập trong câu trả lời của mình, thuộc tính dividerPadding KHÔNG thêm đệm bổ sung vào hai bên của dải phân cách dọc, như người ta có thể giả định. Thay vào đó, nó xác định phần đệm trên và dưới và do đó có thể cắt ngắn dải phân cách nếu nó quá lớn.


6

Bạn có thể sử dụng dải phân cách được tích hợp sẵn, điều này sẽ hoạt động cho cả hai hướng.

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

3

Thật thất vọng, bạn phải bật hiển thị các dải phân cách từ mã trong hoạt động của mình. Ví dụ:

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

}

Mặc dù đó là một cách làm khác nhưng không cần thiết.
Ricardo A.

2

Dải phân cách của bạn có thể không hiển thị do tấm ngăn quá lớn. Bạn đặt 22dip, điều đó có nghĩa là dải phân cách được cắt bớt 22dip từ trên xuống và 22dip từ dưới cùng. Nếu chiều cao bố cục của bạn nhỏ hơn hoặc bằng 44dip thì không có dải phân cách nào được hiển thị.


1

Nếu câu trả lời của Kapil Vats không hoạt động, hãy thử một cái gì đó như sau:

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

Tôi gặp sự cố trong đó thuộc tính padding không hoạt động, do đó tôi phải đặt chiều cao của dải phân cách trực tiếp trong dải phân cách.

Ghi chú:

Nếu bạn muốn sử dụng nó trong LinearLayout dọc, hãy tạo một cái mới, như sau: 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

Để được vẽ, dải phân cách LinearLayoutphải có một số chiều cao ColorDrawable(về cơ bản #00ff00cũng như bất kỳ màu mã cứng nào khác) không có. Cách đơn giản (và chính xác) để giải quyết vấn đề này, là bọc màu của bạn thành một số màu Drawablecó chiều cao được xác định trước, chẳng hạn như có thể shapevẽ được


-1

Bạn phải tạo chế độ xem bất kỳ cho bộ phân tách như chế độ xem văn bản hoặc chế độ xem hình ảnh, sau đó đặt nền cho chế độ xem đó nếu bạn có hình ảnh khác sử dụng màu làm nền.

Hy vọng điều này sẽ giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.