จะเพิ่มตัวแบ่ง (แนวตั้ง) ให้กับ 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
alex

jelly bean 4.2 api 17
Ahmed-Anas

หากคุณได้ลองทำทุกอย่างแล้วตรวจสอบให้แน่ใจว่า LinearLayout มีการวางแนวที่ถูกต้อง การตั้งค่าความสูงสำหรับตัวแบ่งที่มีแนวนอนจะทำให้สับสนมาก
Nino van Hooff

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

@ death_relic0 android: divider is avil สำหรับ ListView, Expandable Listview และ TabWidget
Padma Kumar

9
ขอบคุณ แต่ทำไมถึงอยู่ที่นี่: s developer.android.com/reference/android/widget/…
Ahmed-Anas

ดูเหมือนว่าคุณควรใช้สีใด ๆ ที่วาดได้ไม่ใช่สี
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) ขึ้นไป


แต่นั่นจะเพิ่มตัวแบ่งหนึ่งตัว .. สมมติว่าฉันมีองค์ประกอบเหมือน 10 อย่างการเพิ่มโค้ดเพิ่มเติมสำหรับตัวแบ่งระหว่างแต่ละองค์ประกอบดูเหมือนจะเป็นการสิ้นเปลือง
Ahmed-Anas

@ death_relic0 ทำไมคุณไม่สร้างเค้าโครงแยกต่างหากสำหรับตัวแบ่งแล้วใช้แท็กรวมเพื่อเพิ่มได้ทุกที่และหลายเวลาที่คุณต้องการ ฉันคิดว่าสิ่งนี้จะทำให้ฉันดีขึ้นกว่านี้และไม่เสียเปล่า
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

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


นี่เป็นวิธีเดียวในการเพิ่มช่องว่างแนวตั้งให้กับตัวแบ่งหรือไม่?
SARose

1
@SARose ไม่คุณสามารถสร้างมุมมองที่กำหนดเองหรือเจาะเข้าสู่ส่วนประกอบมุมมองที่มีอยู่ได้ตลอดเวลา อย่างไรก็ตามนี่เป็นวิธีเริ่มต้นและวิธีที่ต้องการ
Rolf ツ

8

ฉันเพิ่งพบปัญหาเดียวกันในวันนี้ ตามที่คำตอบก่อนหน้านี้ระบุว่าปัญหาเกิดจากการใช้สีในแท็กตัวแบ่งแทนที่จะเป็นแบบวาดได้ อย่างไรก็ตามแทนที่จะเขียน xml ที่วาดได้ของตัวเองฉันชอบใช้แอตทริบิวต์ที่เป็นธีมให้มากที่สุด คุณสามารถใช้ android: attr / dividerHorizontal และ android: attr / dividerVertical เพื่อรับ drawable ที่กำหนดไว้ล่วงหน้าแทน:

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

}

แม้ว่าจะเป็นวิธีการอื่น แต่ก็ไม่จำเป็นต้องมี
Ricardo A.

2

ตัวแบ่งของคุณอาจไม่แสดงเนื่องจากตัวแบ่งมีขนาดใหญ่เกินไป คุณตั้งค่า 22dip นั่นหมายความว่าตัวแบ่งถูกตัดด้วย 22dip จากด้านบนและ 22dip จากด้านล่าง หากความสูงของเค้าโครงของคุณน้อยกว่าหรือเท่ากับ 44dip จะไม่ปรากฏตัวแบ่ง


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>

เค้าโครง / 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ด้วยความสูงที่กำหนดไว้ล่วงหน้าเช่นshapedrawable


-1

คุณต้องสร้างมุมมองใด ๆ สำหรับการแยกเช่น textview หรือ imageview จากนั้นตั้งพื้นหลังหากคุณมีภาพอื่นให้ใช้สีเป็นพื้นหลัง

หวังว่านี่จะช่วยคุณได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.