Создание представлений с использованием как XML, так и кода — элементы не отображаются

Я делаю простое приложение для звуковой панели - кнопки должны отображаться в двух столбцах, нажатие кнопки воспроизводит звук. Я сделал это, и все кнопки были определены с помощью XML, и все работало нормально, но поскольку приложение уже подключало прослушиватель для воспроизведения звука с использованием цикла, я решил определить кнопки, используя только код.

Таким образом, в коде нет ошибок, и приложение запускается, но кнопки не появляются. Здесь есть аналогичная проблема: Контент не отображается в динамически созданном Android TableLayout хотя, если я правильно понимаю, предлагаемое решение (убедитесь, что я использую TableLayout.LayoutParams) здесь уже применяется.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.main_table2);

    int[] sounds = { ... };

    String[] labels = { ... };

    declareButtons(sounds, labels);
}

private void declareButtons(int[] sounds, String[] labels)
{
    TableLayout tbl = (TableLayout) this.findViewById(R.id.tblMain);
    TableRow row = null;
    Button cell;

    for (int i=0; i<sounds.length; i++)
    {
        cell = new Button(this);
        cell.setText(labels[i]);
        cell.setOnClickListener(this.getStartListener(sounds[i]));

        cell.setBackgroundDrawable(getResources().getDrawable(R.drawable.soundbutton));
        cell.setTextColor(color.white);
        TableLayout.LayoutParams cellParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT, (float) 1);
        cellParams.leftMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
        cellParams.topMargin = cellParams.leftMargin;

        if (i%2==0) // left column
        {
            row = new TableRow(this);
            cell.setLayoutParams(cellParams);
            row.addView(cell);
        }
        else // right column
        {
            cellParams.rightMargin = cellParams.leftMargin;
            cell.setLayoutParams(cellParams);
            row.addView(cell);
            row.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
            tbl.addView(row);
        }
    }

    if (sounds.length%2 > 0) // handle uneven amount of buttons
        tbl.addView(row);
}

А вот и макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/leonbg2"
    android:orientation="vertical" >

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TableLayout
            android:id="@+id/tblMain"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >


        </TableLayout>
    </ScrollView>

</LinearLayout>

Вот как строки таблицы были определены ранее, и это работало нормально:

        <TableRow
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >

            <Button
                android:id="@+id/buttonaw"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginTop="5dp"
                android:layout_weight="1"
                android:background="@drawable/soundbutton"
                android:text="A what?"
                android:textColor="@android:color/white" />

            <Button
                android:id="@+id/buttona"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:layout_marginTop="5dp"
                android:layout_weight="1"
                android:background="@drawable/soundbutton"
                android:text="Argh!"
                android:textColor="@android:color/white" />
        </TableRow>

person Dreen    schedule 31.05.2012    source источник
comment
Я думаю, что вы создаете одну и ту же кнопку cell всегда в цикле, разве она не должна быть разной для каждой итерации, например, массив кнопок или что-то еще? И где вы устанавливаете свой вид на приложение?   -  person Imran Rana    schedule 31.05.2012


Ответы (1)


Что ж, мне удалось исправить это самостоятельно, избавившись от TableLayout и перейдя на кучу LinearLayout (по одному на каждую строку). Код более или менее такой же с добавлением row.setOrientation(LinearLayout.HORIZONTAL); перед cell.setLayoutParams(cellParams); в части левого столбца оператора if. Мораль истории такова; если вы думаете, что вам нужно использовать TableLayout, вы, вероятно, этого не сделаете. Мир.

person Dreen    schedule 31.05.2012