Apa yang setara dengan "colspan" di TableLayout Android?

132

Saya menggunakan TableLayout di Android. Saat ini saya memiliki satu TableRow dengan dua item di dalamnya, dan, di bawah itu, TableRow dengan satu item di dalamnya. Itu membuat seperti ini:

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

Yang ingin saya lakukan adalah membuat Sel 3 meregangkan kedua sel atas, sehingga terlihat seperti ini:

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

Dalam HTML saya akan menggunakan COLSPAN .... bagaimana cara membuat ini bekerja di Android?

Spike Williams
sumber
Imho, saya menemukan cara yang lebih baik untuk melakukan ini. Inilah jawabannya: stackoverflow.com/a/18682293/1979882
Vyacheslav
1
Sebagai catatan, perhatikan bahwa TableLayout pada dasarnya adalah LinearLayout. Itu artinya Anda dapat menambahkan anak apa pun secara langsung. Jadi untuk tampilan semua-kolom-rentang tunggal, Anda bisa melewati TableRow.
ralfoide

Jawaban:

196

Tampaknya ada atribut yang melakukan itu: layout_span

PEMBARUAN: Atribut ini harus diterapkan pada anak-anak dari TableRow. BUKAN ke TableRow itu sendiri.

Sephy
sumber
8
Yup, ini dia. Widget tata letak Eclipse tampaknya tidak mengetahuinya, karena tidak terdaftar di antara properti yang tersedia. Tapi itu berhasil.
Spike Williams
2
Anda tahu, +1 untuk pembaruan Anda dalam jawabannya. Saya mencoba mencari tahu mengapa Eclipse tidak memberikan opsi itu pada Ctrl + Space! : D;)
Nirav Zaveri
Saya saya menggunakan layout_span pada pandangan saya. Maka saya tidak bisa menggunakan bobot pada pandangan itu. Saya harus menggunakan wrap_content. Mengapa?
eC Droid
93

Hanya untuk melengkapi jawabannya, atribut layout_span harus ditambahkan ke anak, bukan ke TableRow.

Cuplikan ini menunjukkan baris ketiga dari tableLayout saya, yang membentang selama 2 kolom.

<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>
Maragues
sumber
36

Dan ini adalah bagaimana Anda melakukannya secara terprogram

//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);
Onimusha
sumber
7
Anda mungkin juga perlu mengatur params.weight = 1 untuk membuat konten yang dibentang mengisi baris.
rmirabelle
1
Itu tidak bekerja. stackoverflow.com/a/18682293/1979882 Di sini saya menulis penjelasannya.
Vyacheslav
7
Pastikan untuk menambahkan anak ke baris terlebih dahulu.
Artem Kalinchuk
1
Jawaban @DacSaunders dibatalkan. Hasil edit Anda khusus untuk kebutuhan Anda. Jawaban aslinya generik untuk metode ini dan 31 jempol mungkin memberi tahu Anda mungkin Anda melakukan sesuatu yang salah? Lihat komentar Artem juga yang menyoroti anak perlu ditambahkan terlebih dahulu. Dalam childhal ini bisa apa saja, bukan hanya tampilan teks seperti yang disarankan edit Anda. Terima kasih
Onimusha
27

Anda harus menggunakan layout_weight untuk mengisi seluruh baris jika tidak, ia masih mengisi kolom kiri atau kanan tata letak tabel.

<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>
Raghavendra
sumber
3
Terima kasih. Ini adalah informasi yang hilang untuk elemen kecil atau fleksibel, dalam kasus saya seorang Spinner.
chksr
5

Mungkin ini akan membantu seseorang. Saya mencoba solusinya dengan layout_spantetapi ini tidak berhasil untuk saya. Jadi saya memecahkan masalah dengan trik ini. Cukup gunakan LinearLayoutdi tempat TableRowAnda membutuhkan colspan, itu saja.

Dimanoid
sumber
1
Dan itu tidak perlu menjadi LinearLayout. Saya hanya melihat, seperti yang saya inginkan.
JPMagalhaes
3

gunakan android: layout_span di elemen turunan dari elemen TableRow

Mosia
sumber
1

Saya punya beberapa masalah dengan rowspan, dalam hal TableRow, Textview dan sebagainya, dihasilkan dengan kode. Bahkan jika jawaban Onimush tampaknya bagus, itu tidak berfungsi dengan UI yang dihasilkan.

Ini adalah sepotong kode yang .... tidak berfungsi:

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

Kode tampaknya OK tetapi, ketika Anda mencapai init "the_params" itu mengembalikan NULL.

Di sisi lain, kode ini berfungsi seperti pesona:

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

Satu-satunya perbedaan adalah bahwa saya mendorong Textview di dalam TableRow sebelum mengatur rentang. Dan dalam hal ini, itu berhasil. Semoga ini bisa membantu seseorang!

Peter
sumber
0

Saya pikir Anda perlu membungkus tata letak di sekitar yang lain. Memiliki satu daftar Tata Letak secara vertikal, di dalam memiliki satu lagi (atau dalam hal ini, dua) daftar secara horizontal.

Saya masih merasa kesulitan untuk membagi antarmuka menjadi 50-50 bagian di Android.

RobGThai
sumber
Saya akhirnya melakukan ini untuk mengatasi bug terkait tabel yang menyebabkan 1/3 tata letak saya disembunyikan dalam mode lansekap, untuk alasan yang tidak diketahui.
Spike Williams