2017-02-22 92 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;