2013-02-14 236 views
1

我的问题是更好地与一个图来说明,但这里的总体思路是:的Android:重新按下按钮时动态添加按钮

我动态地添加按钮的布局。这些按钮在用户交互过程中添加。如果有一个按钮,我希望它在父项中居中。

|...............[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]..............................| 

这只是看起来丑陋/俗气,所以我希望他们以编程方式铺设就像我在顶部介绍的那样。


是否可以做我在问什么?如果是这样,我该如何去做呢?

回答

2

如下你可以这样做:

1 /使用RelativeLayout作为根ViewGroup所有这一切。

2 /使用LinearLayoutButtons每一行,将其设置为具有唯一的ID,并有RelativeLayout.LayoutParams设置为WRAP_CONTENT其宽度和高度。作为一项规则,使用CENTER_HORIZONTAL,并且当您添加一行(第2,3,4等等,即不是第1行)时,请添加规则BELOW,并使用它应该在下面的行的id。

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

EDIT

实施例(其不包括步骤3):

在您的活动添加一个成员变量ViewGroup list,则在活动。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); 
} 
+0

这些按钮并非固定宽度,但由于每个按钮的文字长度不同,它们都会显示为相同的尺寸。另外,你能否在第二步中详细说明/解释?我感到困惑,并没有在第二步的第二部分中遵循。你能否提供一些示例代码来演示?另外,您的方法是否会处理顶端部分中的第三个示例? – 2013-02-14 18:29:58