Създайте TableLayout програмно

Опитвам се да създам TableLayout програмно. Просто няма да работи. Същото оформление в xml файл обаче работи. Ето какво имам:

public class MyTable extends TableLayout
{
    public MyTable(Context context) {
        super(context);

        setLayoutParams(new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        TableRow row = new TableRow(context);
        row.setLayoutParams(new TableRow.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        Button b = new Button(getContext());
        b.setText("hello");
        b.setLayoutParams(new LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        row.addView(b); 
        addView(row)
    }
}

...

// In main activity:
MyTable table = new MyTable(this);
mainLayout.addView(table);

Когато стартирам това, не получавам срив, но нищо не се появява. Ако се отърва от екземпляра TableRow, поне бутонът се появява като директно дете на TableLayout. какво правя грешно


person mark    schedule 07.10.2009    source източник


Отговори (5)


Само за да направя отговора по-ясен:

TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT);
TableRow.LayoutParams rowParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);

TableLayout tableLayout = new TableLayout(context);
tableLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));// assuming the parent view is a LinearLayout

TableRow tableRow = new TableRow(context);
tableRow.setLayoutParams(tableParams);// TableLayout is the parent view

TextView textView = new TextView(context);
textView.setLayoutParams(rowParams);// TableRow is the parent view

tableRow.addView(textView);

Обяснение
Когато извикате setLayoutParams, трябва да предадете LayoutParams на родителския изглед

person Grigori A.    schedule 21.12.2012
comment
Не трябва ли да е tableRow.setLayoutParams(rowParams)? - person Leon; 09.11.2015
comment
Наградата за спасител отива при @Gigori A. и Mark. Gigori A. за този отговор и маркирайте за собствения си отговор. - person Muneeb Mirza; 14.05.2016
comment
Страхотно и полезно решение. Като странична бележка, трябва да добавите реда към таблицата, преди да добавите текстовия изглед към реда. tableLayout.addView(tableRow); - person The_Martian; 20.10.2016
comment
Прекарах един час, опитвайки се да разбера какво правя погрешно - оказа се, че в кода си сте пропуснали да добавите tableRow към tableLayout: tableLayout.addView(tableRow); - person Starwave; 08.05.2017

Оказа се, че трябва да посоча TableRowLayout, TableLayout и т.н. за параметрите на оформлението, в противен случай таблицата просто няма да се покаже!

person mark    schedule 07.10.2009
comment
Можете ли да публикувате вашето кодово решение? Изглежда, че вече правите това по-горе. - person Atma; 30.08.2011
comment
Благодаря ти! @Atma TableRows трябва да използва TableLayout.LayoutParams, а изгледите вътре в TableRows трябва да използват TableRow.LayoutParams. :) - person Brayden; 15.05.2012
comment
Ужасно е, че трябва изрично да направите това, но при мен се получи, благодаря! - person Geert Weening; 18.03.2013
comment
Благодаря ти @Brayden! Това беше малкият детайл, който пропуснах в моя подклас на TableLayout, който автоматично имаше всички TableLayout.LayoutParams, а не TableRow.LayoutParams! - person Anonsage; 08.10.2014

Добро решение е да раздувате файлове с оформление за всяко копие на ред, който искате да създадете. Вижте тази публикация: Как да дублирам Views за попълване на списъци и таблици?

person clotilde    schedule 11.01.2014

За мен, за да получа моя, трябваше да се обадя на addContentView().

person John Moses    schedule 14.04.2012

Проблемът ви е в този ред:

b.setLayoutParams(new LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));

Трябва да промените LayoutParams на TableRow.LayoutParams:

b.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
person ericn    schedule 09.11.2016