使用XML和代码创建视图 - 未显示的元素

时间:2012-05-31 07:33:30

标签: android android-layout tablelayout

我正在制作一个简单的音板应用程序 - 按钮应该出现在两列中,按一个按钮播放声音。我做了它并且使用XML定义了所有按钮并且它工作正常,但由于应用程序已经附加了一个使用循环播放声音的监听器,我决定仅使用代码定义按钮。

因此代码没有错误,应用程序启动但没有按钮出现。这里有一个类似的问题:Content not showing in dynamically created 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>

1 个答案:

答案 0 :(得分:0)

好吧,我设法通过摆脱TableLayout并寻找一堆LinearLayout s(每行一个)来自行修复它。在if语句的左列部分row.setOrientation(LinearLayout.HORIZONTAL);之前添加cell.setLayoutParams(cellParams);,代码大致相同。这个故事的寓意是;如果你认为你需要使用TableLayout,你可能不会。和平。