Android TableLayout'taki "colspan" eşdeğeri nedir?


132

Android'de bir TableLayout kullanıyorum. Şu anda içinde iki öğe olan bir TableRow'um var ve bunun altında bir öğeli bir TableRow var. Şöyle işler:

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

Yapmak istediğim şey, Hücre 3'ün her iki üst hücreye de yayılmasını sağlamak, bu yüzden şuna benziyor:

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

HTML'de bir COLSPAN kullanırdım .... bunu Android'de nasıl çalıştırırım?


Imho, bunu yapmanın daha iyi bir yolunu buluyorum. İşte cevap: stackoverflow.com/a/18682293/1979882
Vyacheslav

1
Kayıt için, bir TableLayout'un esasen bir LinearLayout olduğuna dikkat edin. Bu, herhangi bir çocuğu doğrudan ekleyebileceğiniz anlamına gelir. Dolayısıyla, tek bir tüm sütunu kapsayan görünüm için TableRow'u atlayabilirsiniz.
ralfoide

Yanıtlar:


196

Bunu yapan bir öznitelik var gibi görünüyor: layout_span

GÜNCELLEME: Bu öznitelik TableRow'un alt öğelerine uygulanmalıdır. TableRow'un kendisine DEĞİL.


8
Evet, bu o. Eclipse mizanpaj widget'ı, mevcut özellikler arasında listelenmediğinden, bundan haberi yok gibi görünüyor. Ama işe yarıyor.
Spike Williams

2
Bilirsiniz, yanıttaki güncellemeniz için +1. Eclipse'in Ctrl + Space'te bu seçeneği neden vermediğini bulmaya çalışıyordum! : D;)
Nirav Zaveri

Kendi görüşümde layout_span kullanıyorum. O halde o görünümde ağırlık kullanamam. Wrap_content kullanmalıyım. Neden?
eC Droid

93

Sadece cevabı tamamlamak için layout_span özniteliği TableRow'a değil, alt öğeye eklenmelidir.

Bu kod parçası, 2 sütuna yayılan tableLayout'umun üçüncü satırını gösterir.

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

36

Ve bunu programlı olarak nasıl yaparsınız

//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
Yayılmış içeriğin satırı doldurması için params.weight = 1 ayarlamanız da gerekebilir.
rmirabelle

1
Çalışmıyor. stackoverflow.com/a/18682293/1979882 Burada açıklamayı yazdım.
Vyacheslav

7
Önce çocuğu satıra eklediğinizden emin olun.
Artem Kalinchuk

1
@DacSaunders Cevap geri alındı. Düzenlemeniz ihtiyacınıza özeldi. Orijinal cevap, yöntem için geneldir ve 31 başparmak yukarı, belki yanlış bir şey yaptığınızı söyleyebilir mi? Artem'in önce çocuğun eklenmesi gerektiğini vurgulayan yorumuna da bakın. childBu durumda sizin düzenleme önerdi sadece TextView'un gibi bir şey olabilir. Teşekkürler
Onimusha

27

Tüm satırı doldurmak için layout_weight kullanmanız gerekir, aksi takdirde tablo düzeninin sol veya sağ sütununu doldurmaya devam eder.

<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
Teşekkür ederim. Bu, benim durumumda bir Spinner olan küçük veya esnek elemanlar için eksik bilgiydi.
chksr

5

Belki bu birine yardımcı olur. Çözümü ile denedim layout_spanama bu benim için çalışmıyor. Ben de sorunu bu numara ile çözdüm. Sadece kolanca ihtiyacınız LinearLayoutolan TableRowyerde kullanın , hepsi bu.


1
Ve bir LinearLayout olması gerekmez. İstediğim gibi sadece bir manzara koydum.
JPMagalhaes

3

TableRow öğesinin alt öğesinde android: layout_span kullanın


1

Kodla oluşturulan TableRow, Textview vb. Durumlarda satır aralığı ile ilgili bazı sorunlar yaşadım. Onimush cevabı iyi gibi görünse bile, oluşturulan UI ile çalışmaz.

İşte .... çalışmayan bir kod parçası:

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

Kod tamam gibi görünüyor, ancak "the_params" initine ulaştığınızda NULL döndürüyor.

Öte yandan, bu kod bir cazibe gibi çalışır:

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

Tek fark, aralığı ayarlamadan önce Textview'u TableRow içinde itmem. Ve bu durumda işe yarıyor. Umarım bu birine yardımcı olur!


0

Sanırım bir düzeni bir başkasının etrafına sarmanız gerekiyor. Dikey olarak bir Düzen listesi oluşturun, içinde yatay olarak başka bir (veya bu durumda iki) liste yapın.

Hala Android'de arayüzü 50-50 kısmına güzel bir şekilde bölmekte zorlanıyorum.


Bunu, mizanpajımın 1 / 3'ünün bilinmeyen nedenlerle manzara modunda gizlenmesine neden olan tabloyla ilgili farklı bir hatayı aşmak için yaptım.
Spike Williams
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.