2011-03-17 82 views
0

我想动态地将一些按钮添加到RelativeLayout,但我的代码不起作用。它将它们添加到显示屏上的相同位置。RelativeLayout with buttons

private void createButtons() { 
     buttons = new ArrayList<Button>(); 
     RelativeLayout bg = (RelativeLayout) findViewById(R.id.Bg); 
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 

     for(int i = 0; i < channels.size(); i++){ 
      Button newButton = new Button(this); 
      newButton.setId(i); 
      newButton.setText(channels.get(i).getTitle()); 
      buttons.add(newButton); 
      if(i > 0){ 
       lp.addRule(RelativeLayout.RIGHT_OF, i-1); 
       bg.addView(newButton, lp); 
      }else{ 
       bg.addView(newButton); 
      } 
     } 

    } 

我该如何解决才能使其工作?

+1

由于您为每次迭代调用lp.addRule(),您的LayoutParams不会为每次迭代包含一个(冲突)规则。也许应该在每次迭代中实例化LayoutParams? – rogerkk 2011-03-17 18:27:29

回答

2

你有几个问题。首先,您需要为每个按钮创建布局新布局参数,以避免@rogerkk指出的问题。其次,您尝试将第一个按钮的ID设置为零。这不起作用。

这是修复这两个问题的函数的返工。

private void createButtons() { 
    buttons = new ArrayList<Button>(); 
    RelativeLayout bg = (RelativeLayout) findViewById(R.id.Bg); 

    for(int i = 0; i < channels.size(); i++){ 
     Button newButton = new Button(this); 
     newButton.setId(i+1); // ID of zero will not work 
     newButton.setText(channels.get(i).getTitle()); 
     buttons.add(newButton); 
     // New layout params for each button 
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 

     if(i > 0){ 
      // using getId() here in case you change how you assign IDs 
      int id =buttons.get(i-1).getId(); 
      lp.addRule(RelativeLayout.RIGHT_OF, id); 
     } 
     bg.addView(newButton,lp);    
    } 

}