Android动态创建按钮并填充布局

Zah*_*ary 4 android android-widget dynamically-generated android-layout

我正在动态创建一个按钮.按钮的数量取决于arraylist的大小.问题是,在创建按钮后,我将使用addview方法添加到布局中.问题是我使用线性布局,因为线性布局的默认方向是水平的,因此按钮将水平填充布局.因为有些按钮不可见.我想要实现的是这样的事情

android消息联系人中的多个按钮

我的代码如下:

Button[] tv = new Button[arraylist.size()];
for(int i=0;i<arraylist.size();i++){                                
    tv[i] = new Button(getApplicationContext());
    tv[i].setText(arraylist.get(i).toString());
    tv[i].setTextColor(Color.parseColor("#000000"));
    tv[i].setTextSize(20);
    tv[i].setPadding(15, 5, 15, 5);     
    linearlayout.addView(tv[i]);    
}
Run Code Online (Sandbox Code Playgroud)

如果我将线性布局的方向设置为垂直,则按钮将垂直填充.因此,如果有任何解决方案动态创建按钮并填充水平和垂直布局,如图所示.

Dev*_*red 7

SDK中没有一个罐装布局可以完全符合您的目标(即,尽可能水平布置多个孩子,然后流向下一行以布置更多),因此您需要创建一个自定义ViewGroup实现这一目的.幸运的是,Romain Guy在Devoxx的演示中创建了一个现场直播.

这是演示视频的链接.

以下是示例代码和幻灯片的链接.

HTH


Zah*_*ary 6

经过2天努力思考这个问题终于我找到了解决方案.我试着把我所有的联系人列表,存储在arraylist中并为每个元素创建按钮,我对屏幕上显示后的结果非常满意.这是我如何做到这一点.我非常感谢其他人的评论.

变量声明;

int currWidth;
int currCounter;
boolean isNewLine;
LinkedList<HashMap<String,Object>> button;
ArrayList<String> nameNumber = new ArrayList<String>();
contactWrapper = (LinearLayout) findViewById(R.id.multiple_selection);
Run Code Online (Sandbox Code Playgroud)

创建按钮onClick事件;

for(int i=0;i<nameNumber.size();i++){                               
            tv[i] = new Button(getApplicationContext());                            
            String[] namePhone = nameNumber.get(i).toString().split("@@");
            phoneNumber.add(namePhone[1]);
            tv[i].setText(namePhone[0]);
            tv[i].setTag(namePhone[1]);
            tv[i].setTextColor(Color.parseColor("#000000"));                                
            tv[i].setTextSize(20);
            tv[i].setPadding(15, 5, 15, 5);                                 
            tv[i].measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            HashMap<String, Object> map = new HashMap<String,Object>();
            map.put("button", tv[i]);
            map.put("width", tv[i].getMeasuredWidth());                             
            button.add(map);
        }
        drawLayout();
Run Code Online (Sandbox Code Playgroud)

drawlayout方法是我添加按钮并相应排列以适应布局的地方;

public void drawLayout(){
        int counter=0;
        contactWrapper.setOrientation(LinearLayout.VERTICAL);
        currCounter=0;
        currWidth=0;
        isNewLine=false;
        LinearLayout[] row = new LinearLayout[nameNumber.size()];
        row[currCounter] = new LinearLayout(getApplicationContext());
        @SuppressWarnings("rawtypes")       
        Iterator it = button.iterator();
        for(int i = 0; i<button.size(); i++){   
            it.next();  
            row[currCounter].setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
            currWidth += Integer.parseInt(button.get(i).get("width").toString());
            if(isNewLine){              
                if(currWidth < contactWrapper.getWidth()){  
                    row[currCounter].addView((View) button.get(i).get("button"));
                    if(!it.hasNext()){                      
                        contactWrapper.addView(row[currCounter]);
                    }else{                      
                        if(contactWrapper.getWidth()<(currWidth+Integer.parseInt(button.get(i+1).get("width").toString()))){
                            isNewLine=true;
                            contactWrapper.addView(row[currCounter]);
                            currCounter+=1; 
                            row[currCounter] = new LinearLayout(getApplicationContext());
                            currWidth=0;
                        }else{
                            isNewLine=false;
                        }
                    }
                }else{
                    isNewLine=true;
                    contactWrapper.addView(row[currCounter]);
                    currCounter+=1; 
                    row[currCounter] = new LinearLayout(getApplicationContext());
                    currWidth=0;
                }                                               
            }else{
                if(currWidth < contactWrapper.getWidth()){                                      
                    if(!it.hasNext()){
                        row[currCounter].addView((View) button.get(i).get("button"));
                        contactWrapper.addView(row[currCounter]);
                    }else{
                        row[currCounter].addView((View) button.get(i).get("button"));
                        if(contactWrapper.getWidth()<(currWidth+Integer.parseInt(button.get(i+1).get("width").toString()))){
                            isNewLine=true;
                            contactWrapper.addView(row[currCounter]);
                            currCounter+=1; 
                            row[currCounter] = new LinearLayout(getApplicationContext());
                            currWidth=0;
                        }else{
                            isNewLine=false;
                        }
                    }
                }else{
                    isNewLine=true;
                    contactWrapper.addView(row[currCounter]);
                    currCounter+=1; 
                    row[currCounter] = new LinearLayout(getApplicationContext());
                    currWidth=0;
                }
            }           
            counter++;
        }            
    }
Run Code Online (Sandbox Code Playgroud)

这段代码相当混乱+我没有充分利用数组的大小

LinearLayout[] row = new LinearLayout[nameNumber.size()];
Run Code Online (Sandbox Code Playgroud)

但它对我有用.