1

用图表可以更好地解释我的问题,但总体思路如下:

我正在向布局中动态添加按钮。在整个用户交互过程中添加按钮。如果有一个按钮,我希望它位于父级的中心。

|...............[Button 1]...............|

对于两个按钮,我希望它们彼此相邻居中。

|..........[Button 1][Button 2]..........|

这种模式将一直持续到一定数量的按钮(以免它们全部聚集在同一行/行)。因此,假设每行/行的最大按钮数为 4。因此,对于任何数量大于 4 的按钮,我希望它们在以下行/行上均匀拆分。所以对于 5 个按钮,它看起来像这样:

|.....[Button 1][Button 2][Button 3].....|
|..........[Button 4][Button 5]..........|

基本上我希望能够以编程方式在行/行中布局按钮,以便每行包含尽可能相同(或接近相同)数量的按钮,因此它们分布均匀。


目前我的按钮以网格格式布局,在调用之前是不可见的,但它看起来很难看。所以它看起来像这样:

|[Button 1][Button 2]....................|

或者如果有 5 个按钮,它看起来像这样:

|[Button 1][Button 2][Button 3][Button 4]|
|[Button 5]..............................|

这只是看起来丑陋/俗气,所以我希望它们像我在顶部部分中解释的那样以编程方式布局。


有可能做我要求的吗?如果是这样,我将如何去做?

4

1 回答 1

2

你可以这样做:

1/ 使用 aRelativeLayout作为所有这些的根ViewGroup

2/LinearLayout对 的每一行使用 a Buttons,将其设置为具有唯一 ID,并为其宽度和高度RelativeLayout.LayoutParams设置为。用作规则,当您添加一行(第 2、3、4 等,即不是第 1 行)时,另外添加 rule ,并WRAP_CONTENT使用它应该在下面的行的 id。CENTER_HORIZONTALBELOW

3/ 要确定 aButton是否适合一行,请使用 . 获取行的宽度和RelativeLayout(在步骤 1 中)的宽度getMeasuredWidth()。使用那些你可以检查是否Button适合 - 假设它们使用固定宽度。

编辑

示例(不包括第 3 步):

在您的 Activity 中添加一个成员变量ViewGroup list,然后在 Activity.onCreate() 中:

list = new RelativeLayout(this);
list.setLayoutParams(new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
setContentView(list);

添加方法来添加按钮。

private void addButton(String btnTitle)
{
    // find out how many rows we have in our relative layout  
    int rowCount = list.getChildCount();

    int buttonCount = MY_MAX_BUTTONS_PER_ROW;

    // find out how many buttons are in the last row
    if (rowCount > 0) buttonCount = ((ViewGroup)list.getChildAt(rowCount-1)).getChildCount();

    final ViewGroup row;

    // do we have no rows, or is there no room for another button?
    if (rowCount == 0 || buttonCount >= MY_MAX_BUTTONS_PER_ROW)
    {
        // create a row 
        LinearLayout newRow = new LinearLayout(this);
        newRow.setId(rowCount+1);
        RelativeLayout.LayoutParams rowLP = new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
        rowLP.addRule(CENTER_HORIZONTAL);
        if (rowCount > 0) rowLP.addRule(BELOW, rowCount);

        list.addView(newRow, rowLP);

        rowCount++;  

        row = newRow;
    }
    // .. there's room, so add it to the last row
    else 
    {
        row = (ViewGroup)list.getChildAt(rowCount-1);
    }

    // create one of your buttons
    // ...

    button.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
    row.addView(button);
}
于 2013-02-14T07:38:22.213 回答