2017-02-22 89 views
0

我需要显示一个问题以及我从服务器获取的选项列表。每个选项都有一个标题和一个图像,这些选项应该是可点击的。所以我创建了一个扩展到RelativeLayout的类ImageButton,每个选项都是一个ImageButton。我也创建一个扩展到GridLayout的类ImageButtonGroup,并动态地将所有的ImageButton添加到这个ImageButtonGroup。将自定义按钮动态分配到自定义网格布局

它工作正常,除了ImageButtons的对齐。 ImageButton的大小取决于标题文本的长度(对于所有选项,图像的大小相同),我很难将相等的单元格空间分配给网格布局中的每个ImageButton。请参阅下面我的代码在那里我加入ImageButtons到ImageButtonGroup:

ImageButtonGroup imageButtonGroup = 
      (ImageButtonGroup) 
       mInflater.inflate(
        R.layout.button_image_response_layout, holder.richTextContainer, false); 
     int total = item.getMessage().getResponseOptions().size(); 
     int col = 3; 
     int row = total/col; 
     imageButtonGroup.setColumnCount(col); 
     imageButtonGroup.setRowCount(row + 1); 
     for (int i = 0; i < total; i++) { 
     ResponseOption responseOption = item.getMessage().getResponseOptions().get(i); 
     ImageButtonView imageButtonView = 
      (ImageButtonView) 
       mInflater.inflate(
        R.layout.image_button_layout, holder.richTextContainer, false); 
     imageButtonView.setData(
      responseOption.getImage(), responseOption.getViewText(), responseOption.getValue()); 
     GridLayout.LayoutParams gridParam = new GridLayout.LayoutParams(); 
     gridParam.setGravity(Gravity.CENTER); 
     gridParam.topMargin = 10; 
     gridParam.bottomMargin = 10; 
     gridParam.width = GridLayout.LayoutParams.WRAP_CONTENT; 
     gridParam.height = GridLayout.LayoutParams.WRAP_CONTENT; 
     imageButtonGroup.addView(imageButtonView, gridParam); 

这让我下面的观点:(文字并不总是快乐的,如下图所示) enter image description here

如何动态地分配固定大小细胞到网格布局内的这些按钮?

+0

你可以把你的GridView的实际行为的屏幕? –

+0

更新了实际屏幕。 – Prabhat

回答

0

您可以指定行和列在创建GridLayoutParams,这样它会处理本身大小dependending的匹配上的总空间:

GridLayout.LayoutParams first = new GridLayout.LayoutParams(row, col); 

GridLayout.LayoutParams(GridLayout.Spec rowSpec, GridLayout.Spec columnSpec)

为此rowSpec和 构造一个新的LayoutParams实例columnSpec。

在特定情况下,它会是这样的:

for (int i = 0; i < total; i++) { 
      ResponseOption responseOption = item.getMessage().getResponseOptions().get(i); 
      ImageButtonView imageButtonView = 
       (ImageButtonView) 
        mInflater.inflate(
         R.layout.image_button_layout, holder.richTextContainer, false); 
      imageButtonView.setData(
       responseOption.getImage(), responseOption.getViewText(), responseOption.getValue()); 
Spec row = GridLayout.spec(Math.round(i/3); 
Spec col = GridLayout.spec(i % 3); 
      GridLayout.LayoutParams gridParam = new GridLayout.LayoutParams(row, col); 
      gridParam.setGravity(Gravity.CENTER); 
      gridParam.topMargin = 10; 
      gridParam.bottomMargin = 10; 
      gridParam.width = GridLayout.LayoutParams.WRAP_CONTENT; 
      gridParam.height = GridLayout.LayoutParams.WRAP_CONTENT; 
      imageButtonGroup.addView(imageButtonView, gridParam); 
+0

GridLayout.LayoutParams gridParam = new GridLayout.LayoutParams(Math.round(i/3),i%3);给出“无法解析构造函数LayoutParams(int,int)” – Prabhat

+0

是的,我犯了一个错误。您需要使用Spec对象传递给构造函数。检查编辑的答案。 –

+0

这没有效果。我在想如果体重能够以某种方式来拯救我。但我不确定。 – Prabhat

0

我能做到这一点采取一个暗示从here

我得到了屏幕的宽度,在换算我的布局尺寸的%年龄点(出现总宽度的70%)并除以3(列数)。所以基本上我做的是:

int dWidth = (int)(presenter.getView().getScreenWidth() * .70)/3; 
gridParam.width = dWidth;