วิธีสร้างช่องว่างระหว่างเด็ก ๆ LinearLayout?


160

ฉันกำลังเพิ่มมุมมองที่กำหนดเองใน LinearLayout ในแนวตั้งโดยทางโปรแกรมและฉันต้องการให้มีช่องว่างระหว่างมุมมอง ฉันได้ลองเพิ่ม: setPadding (0, 1, 0, 1) ลงในตัวสร้าง CustomView ของฉัน แต่ดูเหมือนจะไม่มีผลใด ๆ คำแนะนำใด ๆ?

* มันชี้ให้เห็นว่าฉันควรใช้มาร์จิ้น เนื่องจากฉันเพิ่มมุมมองแบบไดนามิกฉันต้องตั้งค่าระยะขอบจากรหัส (ไม่ใช่ xml) ฉันเชื่อว่าวิธีการทำเช่นนี้อยู่ด้านล่าง แต่มันไม่ทำงาน

public class MyView extends View
{
    public MyView (Context context)
    {
        super(context);

        MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT);
        params.setMargins(0, 10, 0, 10);
        setLayoutParams(params);

* แก้ไข ฉันยังลองใช้ MarginLayoutParams เป็นพารามิเตอร์ในขณะที่เพิ่มมุมมองให้กับเค้าโครงแบบเส้นตรง (ดังด้านล่าง) สิ่งนี้ไม่ทำงาน:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);

มันอาจช่วยได้ถ้าคุณเพิ่มไฟล์ XML ที่คุณต้องการเพิ่มมุมมอง
Dennis Winter

2
นี่คือบล็อกโพสต์ที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้: Grid Spacing บน Android โดย Cyril Mottier
Richard Le Mesurier

คำตอบ:


131

คุณควรandroid:layout_margin<Side>ที่เด็ก ๆ การแพ็ดดิ้งเป็นแบบภายใน


คุณสามารถกำหนดมุมมองใน XML ด้วยระยะขอบที่ต้องการและเพิ่มมุมมองที่กำหนดไว้ล่วงหน้าตามขั้นตอนโดยใช้เนื้อหาในโค้ด Java เช่นกัน
Mike Yockey

ฉันไม่ชัดเจนในสิ่งที่คุณหมายถึงโดยสิ่งนี้ ฉันควรกำหนด customview ใน xml หรือไม่ แต่ฉันจะต้องสร้างจำนวนมุมมองที่กำหนดเองแบบไดนามิกซึ่งฉันจะเพิ่มใน LinearLayout ของฉันแบบไดนามิก
ab11

2
ลองใช้ LayoutParams ไม่ใช่ MarginLayoutParams
โทมัส

1
ฉันจะตั้งค่าแอตทริบิวต์ใดใน LinearLayout.LayoutParams ชั้นนั้นดูเหมือนจะไม่มี "ระยะขอบ" หรือ "ช่องว่างภายใน" หรืออะไรทำนองนี้?
ab11

@Thomas ความหมายของ "Padding คือภายใน" ฉันควรจะใช้อัตรากำไรขั้นต้นในแต่ละองค์ประกอบซึ่งผมชนิดของการพยายามที่จะหลีกเลี่ยงเพื่อลดรหัสที่ซ้ำกัน (ที่ผมมีระยะห่างเท่ากันที่จะใช้ระหว่างส่วนประกอบบุตรหลานของฉัน)
OmGanesh

188

API> = 11วิธีการแก้ปัญหา:

คุณสามารถรวมการเติมเข้าไปในตัวแบ่ง ในกรณีที่คุณไม่ได้ใช้เลยให้สร้าง drawable ที่ว่างเปล่าสูง ๆ แล้วตั้งเป็นLinearLayoutdivider

    <LinearLayout
            android:showDividers="middle"
            android:divider="@drawable/empty_tall_divider"
...>...</LinearLayout>

empty_tall_divider.xml:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
            android:height="40dp"
            android:width="0dp"/>
</shape>

คุณสามารถใช้กับ API <11 หากคุณใช้ LinearLayoutCompat: developer.android.com/reference/android/support/v7/widget/?hl=th
นักพัฒนาซอฟต์แวร์ Android

5
ถ้าคุณสร้างรูปร่างเหมือนสี่เหลี่ยมคุณสามารถใช้มันใน LinearLayouts แนวตั้งและแนวนอนโดยไม่จำเป็นต้องสร้างใหม่ที่มีความกว้าง
WarrenFaith

2
นี่คือบล็อกโพสต์ที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้: Grid Spacing บน Android โดย Cyril Mottier
Richard Le Mesurier

1
GONEนี้จะดีกว่าถ้าคุณมีชุดของมุมมองและเปิดบางส่วนของพวกเขา โดยการระบุandroid:showDividers="middle"คุณจะได้รับพื้นที่ที่คุณต้องการจริง
DariusL

@DariusL ฉันไม่พบคุณลักษณะ showDividers ใน d.android.com คุณแน่ใจหรือว่าเราสามารถใช้สิ่งนี้
Henry

35

ตอนนี้ Android รองรับการเพิ่มมุมมองSpaceระหว่างมุมมอง มีให้ตั้งแต่ 4.0 ICS เป็นต้นไป


12
เห็นได้ชัดว่า Android-Fairy ฟังคุณและสร้างมุมมอง "Space" ใน API 14 :) ( developer.android.com/reference/android/widget/Space.html )
API

ฮ่า ๆ! มันเป็นเพียงเรื่องของเวลา
ทำงาน

8
แต่คุณต้องมีที่ว่างต่อการดูซึ่งไม่เหมือนกับประกาศช่องว่างสำหรับการดูทั้งหมด
Lay González

^ จริงมาก อย่างไรก็ตามหากคุณใช้ LinearLayout คุณสามารถเพิ่มตัวแบ่งซึ่งจะนำไปใช้กับมุมมองย่อยแต่ละมุมมอง ดูที่นี่: developer.android.com/reference/android/widget/…
ทำงาน

1
นี่ไม่ใช่คำตอบ
Stealth Rabbi

24

ตัวอย่างด้านล่างทำในสิ่งที่คุณต้องการอย่างเป็นระบบ ฉันใช้ขนาดคงที่ (140,398) แล้ว

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);

ฉันกำลังทำกับอีกหนึ่งขั้นตอนเพิ่มเติมเช่นด้านล่าง LinearLayout.LayoutParams layoutParams = ใหม่ LinearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); จากนั้น button1.setLayoutParams (layoutParams); (ปุ่ม layoutParams) layout.addView; .. ขอบคุณที่แจ้งให้ทราบว่า addview สามารถรับได้ 2 อาร์กิวเมนต์
png

6

ตั้งแต่ API ระดับ 14 คุณสามารถเพิ่ม drawer (transparent) drawable ได้:

android:divider="@drawable/divider"
android:showDividers="middle"

และมันจะจัดการส่วนที่เหลือให้คุณ!


1
คุณจำเป็นต้องระบุ drawer drawable ก่อนหรือคุณสามารถใช้มันโดยไม่มีอะไรอื่นได้อีกหรือไม่?
Tim Kist

8dpสิ่งนี้มาจากไหน
Yousha Aleayoub

1
@TimKist คุณสามารถใช้งานได้โดยไม่คิดอะไรเลย
teh.fonsi

คำตอบนี้ไม่ถูกต้องเพราะ android: dividerPadding ไม่ส่งผลกระทบต่อระยะห่างระหว่างเด็กรูปแบบเชิงเส้น มันใช้การขยายไปยังด้านข้างของตัวแบ่งที่ไม่ต้องเผชิญกับเด็ก ๆ (เช่นการขยายทางซ้ายและขวาบนตัวหารในแนวตั้ง LinearLayout) เอกสาร Android: developer.android.com/reference/android/widget/…
leorleor

2
@leorleor คุณพูดถูก วิธีที่ดีที่สุดน่าจะใช้ตัวแบ่งที่เป็นโปร่งใส ฉันปรับปรุงคำตอบของฉันตาม
teh.fonsi

4

ใช้แทนLinearLayout.LayoutParams นี่คือเอกสารประกอบMarginLayoutParams


ฉันจะตั้งค่าแอตทริบิวต์ใดใน LinearLayout.LayoutParams ชั้นนั้นดูเหมือนจะไม่มี "ระยะขอบ" หรือ "ช่องว่างภายใน" หรืออะไรทำนองนี้?
ab11

LinearLayout.LayoutParamsขยายMarginLayoutParamsและสืบทอดเดียวกันsetMargins()วิธีที่คุณใช้งานดังกล่าวข้างต้น ...
คริสเฟ

โอ้โหขอบคุณ! ฉันกำลังดู: android.view.ViewGroup.LayoutParams
ab11

3

ถ้าคุณใช้ActionBarSherlockคุณสามารถใช้ com.actionbarsherlock.internal.widget.IcsLinearLayout:

<com.actionbarsherlock.internal.widget.IcsLinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="@drawable/list_view_divider"
        android:dividerPadding="2dp"
        android:showDividers="middle" >
...
</com.actionbarsherlock.internal.widget.IcsLinearLayout>

2

การใช้การขยายในโครงร่างของมุมมองเด็ก

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_margin="5dp"
          android:background="@drawable/backage_text"
          android:textColor="#999999"
           >

</TextView>

backage_text.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="@color/white"/>
    <corners android:radius="2dp"/>
    <stroke
        android:width="1dp"
        android:color="#999999"/>
    <padding
        android:bottom="5dp"
        android:left="10dp"
        android:right="10dp"
        android:top="5dp" />
</shape>

0

คุณจะได้รับLayoutParamsของผู้ปกครองLinearLayoutและนำไปใช้กับมุมมองของแต่ละบุคคลด้วยวิธีนี้:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • ใช้ความระมัดระวังที่ setMargins () ใช้พิกเซลเป็นชนิดข้อมูล int ดังนั้นแปลงเป็น dp ก่อนที่จะเพิ่มค่า
  • โค้ดด้านบนจะตั้งค่าความสูงและความกว้างเป็น wrap_content คุณสามารถปรับแต่งมัน

0

ลองเพิ่มวิดเจ็ตSpaceหลังจากเพิ่มมุมมองดังนี้:

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)

0

เป็นวิธีที่ง่ายที่จะทำมันแบบไดนามิกคือการเพิ่มช่องว่างให้กับเด็ก คุณสามารถตั้งค่าโดยใช้. setPadding () บนวัตถุที่จะเพิ่ม ตัวอย่างนี้เป็นการเพิ่ม ImageView ให้กับ LinearLayout:

LinearLayout userFeedLinearLayout = (LinearLayout) findViewById(R.id.userFeedLinearLayout);
imageView.setImageBitmap(bitmap);
imageView.setPadding(0, 30, 0, 30);
userFeedLinearLayout.addView(imageView);

รูปภาพต่อไปนี้แสดง ImageViews สองรายการที่เพิ่มด้วยการเติมเต็ม:

แพ็ดดิ้งกับเด็ก


-1

หากเลย์เอาต์ของคุณมีป้ายข้อความหรือที่เก็บข้อความ คุณสามารถเพิ่มในตอนท้ายของแต่ละข้อความ"\ n"เพื่อแยกบรรทัดและทำช่องว่างระหว่างองค์ประกอบ
ตัวอย่าง:

video?.text="Video NR1: ${obj.Titulo} \n" 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.