如何将具有按钮的行动态添加到表布局中以具有相等的宽度

时间:2015-04-23 20:20:12

标签: android layout android-studio tablelayout

我想动态地将一些宽度相等的按钮添加到表格布局中。我已经尝试过StackOverflow的所有内容,但我找不到合适的解决方案。

这是我最初的XML布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@color/puzzle_background"
    android:orientation="vertical"
    android:layout_height="fill_parent"
    android:layout_width="match_parent"
    android:layout_gravity="center">
    <TextView
        android:text="@string/levels_label"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dip"
        android:layout_marginBottom="10dip"
        android:textSize="28sp" />
    <TableLayout
        android:id="@+id/displayLevels"
        android:background="@color/puzzle_background"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:orientation="vertical" >

    </TableLayout>
</LinearLayout>

这是我的代码部分:

int i = 0;
int j = 0;
while (i<levelNum) {
    j = i + 4;
    row = new TableRow(this);
    TableRow.LayoutParams lp = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
    row.setLayoutParams(lp);
    row.setWeightSum(4);
    while ((i<j)&&(i<levelNum)) {
        Button iBtn = new Button(this);
        iBtn.setGravity(Gravity.CENTER_HORIZONTAL);
        iBtn.setText(Integer.toString(i + 1));
        iBtn.setId(i + 1);
        iBtn.setOnClickListener(btnclick);
        row.addView(iBtn, 4 + i - j);
        i++;
    }
    lTable.addView(row);
}

但是每次我在行中得到4个按钮并不真正适合该行。行中的右键总是在屏幕外。

我做错了什么?请指教。

最诚挚的问候,Alex

2 个答案:

答案 0 :(得分:0)

我会以另一种方式向您提出建议,您可以通过代码了解您的屏幕:

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width1 = displaymetrics.widthPixels;

和下一步设置按钮的宽度:

iBtn.getLayoutParams().width = width1;

或者您可以通过类似功能设置按钮的最大宽度。 我希望这会有所帮助。

答案 1 :(得分:0)

经过一番尝试,我有解决方案:

首先,您的逻辑存在一些问题,two while loops等于one while loop。它使我困惑。

其次,android中的Buttondefault minimunWidth,所以如果setWidth button小于default value,则会设置default value的宽度}。

第三,我使用gravity.CENTER来获取CENTER中的所有按钮。

好的,这是我的解释。以下是我的代码:

TableLayout displayLevels = (TableLayout)findViewById(R.id.displayLevels);
final int screenWidth = dpToPx(getResources().getConfiguration().screenWidthDp);
int i = 0;
int j = 0;
int levelNum = 8;
TableRow row = new TableRow(this);
TableRow.LayoutParams lp = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
row.setLayoutParams(lp);
row.setGravity(Gravity.CENTER);
int width = (screenWidth - (levelNum)*4)/levelNum;//4: I don't remember name of it. It is default value.4dp or 4px... I don't remember exactly

displayLevels.addView(row);
while (i<levelNum) {
    Button iBtn = new Button(this);
    iBtn.setGravity(Gravity.CENTER_HORIZONTAL);
    iBtn.setMinimumWidth(100);//I set 100px for minimunWidth.
    iBtn.setWidth(width);
    iBtn.setText(Integer.toString(i + 1));
    iBtn.setId(i + 1);
    //iBtn.setOnClickListener(btnclick);
    row.addView(iBtn, i);
    i++;
}

with:

private int dpToPx(int dp) {
    return (int) (dp * getResources().getDisplayMetrics().density + 0.5f);
}