“ colspan” ใน Android TableLayout เทียบเท่ากับอะไร


132

ฉันใช้ TableLayout ใน Android ตอนนี้ฉันมี TableRow หนึ่งรายการที่มีสองรายการในนั้นและด้านล่างนั้นคือ TableRow ที่มีหนึ่งรายการ มันแสดงผลดังนี้:

-----------------------------
|   Cell 1    |  Cell 2     |
-----------------------------
|   Cell 3    |
---------------

สิ่งที่ฉันต้องการทำคือทำให้เซลล์ 3 ยืดออกไปทั่วทั้งสองเซลล์ด้านบนดังนั้นจึงมีลักษณะดังนี้:

-----------------------------
|   Cell 1    |  Cell 2     |
-----------------------------
|           Cell 3          |
-----------------------------

ใน HTML ฉันจะใช้ COLSPAN .... ฉันจะทำให้มันทำงานใน Android ได้อย่างไร


อิมโฮฉันคิดว่าวิธีนี้ดีกว่า นี่คือคำตอบ: stackoverflow.com/a/18682293/1979882
Vyacheslav

1
สำหรับเร็กคอร์ดโปรดสังเกตว่า TableLayout เป็น LinearLayout เป็นหลัก นั่นหมายความว่าคุณสามารถเพิ่มลูกคนใดก็ได้โดยตรง ดังนั้นสำหรับมุมมองช่วงคอลัมน์เดียวทั้งหมดคุณสามารถข้าม TableRow ได้
ralfoide

คำตอบ:


198

ดูเหมือนว่ามีแอตทริบิวต์ที่ทำเช่นนั้น: layout_span

อัปเดต: ต้องใช้แอตทริบิวต์นี้กับลูกของ TableRow ไม่ใช่ไปที่ TableRow เอง


8
ใช่นี่คือหนึ่ง ดูเหมือนว่าวิดเจ็ตเค้าโครง Eclipse จะไม่ทราบเกี่ยวกับวิดเจ็ตดังกล่าวเนื่องจากไม่ได้อยู่ในรายการคุณสมบัติที่มีอยู่ แต่มันได้ผล
Spike Williams

2
คุณรู้ไหม +1 สำหรับการอัปเดตของคุณในคำตอบ ฉันพยายามค้นหาว่าเหตุใด Eclipse จึงไม่ให้ตัวเลือกนั้นใน Ctrl + Space! : D;)
Nirav Zaveri

ฉันใช้ layout_span ในมุมมองของฉัน จากนั้นฉันไม่สามารถใช้น้ำหนักกับมุมมองนั้นได้ ฉันต้องใช้ wrap_content ทำไม?
eC Droid

93

เพื่อให้คำตอบสมบูรณ์ต้องเพิ่มแอตทริบิวต์ layout_span ให้กับลูกไม่ใช่ใน TableRow

ตัวอย่างข้อมูลนี้แสดงแถวที่สามของ tableLayout ของฉันซึ่งครอบคลุม 2 คอลัมน์

<TableLayout>
    <TableRow
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="@string/create" />
    </TableRow>
</TableLayout>

38

และนี่คือวิธีที่คุณทำโดยใช้โปรแกรม

//theChild in this case is the child of TableRow
TableRow.LayoutParams params = (TableRow.LayoutParams) theChild.getLayoutParams();
params.span = 2; //amount of columns you will span
theChild.setLayoutParams(params);

7
คุณอาจต้องตั้งค่า params.weight = 1 เพื่อให้เนื้อหาที่ขยายเต็มแถว
rmirabelle

1
มันใช้ไม่ได้ stackoverflow.com/a/18682293/1979882 ที่นี่ฉันเขียนคำอธิบาย
Vyacheslav

7
อย่าลืมเพิ่มลูกลงในแถวก่อน
Artem Kalinchuk

1
@DacSaunders ตอบย้อนกลับ การแก้ไขของคุณเป็นไปตามความต้องการของคุณโดยเฉพาะ คำตอบเดิมเป็นคำตอบทั่วไปสำหรับวิธีการนี้และ 31 การยกนิ้วให้อาจบอกคุณได้ว่าคุณทำอะไรผิด? ดูความคิดเห็นของ Artem ที่เน้นว่าเด็กต้องได้รับการเพิ่มก่อน childในกรณีนี้สามารถเป็นอะไรก็ได้ที่ไม่เพียง แต่เป็น TextView แก้ไขปัญหาของคุณ ขอบคุณ
Onimusha

27

คุณต้องใช้ layout_weight เพื่อเติมเต็มทั้งแถวมิฉะนั้นจะยังคงเติมคอลัมน์ซ้ายหรือขวาของเค้าโครงตาราง

<TableRow
  android:id="@+id/tableRow1"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:layout_weight="1"
            android:text="ClickMe" />

    </TableRow>

3
ขอบคุณ. นี่เป็นข้อมูลที่ขาดหายไปสำหรับองค์ประกอบขนาดเล็กหรือยืดหยุ่นในกรณีของฉันคือ Spinner
chksr

5

บางทีนี่อาจจะช่วยใครบางคนได้ ฉันลองใช้วิธีแก้ปัญหาแล้วlayout_spanแต่ไม่ได้ผลสำหรับฉัน ดังนั้นฉันจึงแก้ปัญหาด้วยเคล็ดลับนี้ เพียงแค่ใช้LinearLayoutแทนTableRowจุดที่คุณต้องการ colspan นั่นคือทั้งหมด


1
และไม่จำเป็นต้องเป็น LinearLayout ฉันใส่เพียงแค่มุมมองตามที่ฉันต้องการ
JPMagalhaes


1

ฉันมีปัญหากับ rowspan ในกรณีของ TableRow, Textview และอื่น ๆ ที่สร้างด้วยรหัส แม้ว่าคำตอบของ Onimush ดูเหมือนจะดี แต่ก็ใช้ไม่ได้กับ UI ที่สร้างขึ้น

นี่คือโค้ดส่วนหนึ่งที่ .... ใช้ไม่ได้:

            TableRow the_ligne_unidade = new TableRow(this);
            the_ligne_unidade.setBackgroundColor(the_grey);

            TextView my_unidade = new TextView(this);
            my_unidade.setText(tsap_unidade_nom);
            my_unidade.setTextSize(20);
            my_unidade.setTypeface(null, Typeface.BOLD);
            my_unidade.setVisibility(View.VISIBLE);

            TableRow.LayoutParams the_param;
            the_param = (TableRow.LayoutParams)my_unidade.getLayoutParams();
            the_param.span = 3;
            my_unidade.setLayoutParams(the_param);

            // Put the TextView in the TableRow
            the_ligne_unidade.addView(my_unidade);

ดูเหมือนว่าโค้ดจะใช้ได้ แต่เมื่อคุณไปถึงจุดเริ่มต้นของ "the_params" จะส่งกลับค่า NULL

ในอีกด้านหนึ่งรหัสนี้ใช้งานได้เหมือนมีเสน่ห์:

            TableRow the_ligne_unidade = new TableRow(this);
            the_ligne_unidade.setBackgroundColor(the_grey);

            TextView my_unidade = new TextView(this);
            my_unidade.setText(tsap_unidade_nom);
            my_unidade.setTextSize(20);
            my_unidade.setTypeface(null, Typeface.BOLD);
            my_unidade.setVisibility(View.VISIBLE);

            // Put the TextView in the TableRow
            the_ligne_unidade.addView(my_unidade);

            // And now, we change the SPAN
            TableRow.LayoutParams the_param;
            the_param = (TableRow.LayoutParams)my_unidade.getLayoutParams();
            the_param.span = 3;
            my_unidade.setLayoutParams(the_param);

ข้อแตกต่างเพียงอย่างเดียวคือฉันดัน Textview เข้าไปใน TableRow ก่อนที่จะตั้งค่าช่วง และในกรณีนี้มันได้ผล หวังว่านี่จะช่วยใครสักคน!


0

ฉันคิดว่าคุณต้องห่อเค้าโครงอื่น มีรายการเค้าโครงหนึ่งรายการในแนวตั้งภายในมีอีกรายการหนึ่ง (หรือในกรณีนี้คือสอง) รายการในแนวนอน

ฉันยังคงพบว่ามันยากที่จะแบ่งส่วนต่อประสานเป็น 50-50 ส่วนใน Android


ฉันลงเอยด้วยการทำเช่นนี้เพื่อแก้ไขข้อผิดพลาดอื่น ๆ เกี่ยวกับตารางซึ่งทำให้ 1/3 ของเลย์เอาต์ของฉันถูกซ่อนในโหมดแนวนอนโดยไม่ทราบสาเหตุ
Spike Williams
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.