【问题标题】:Assigning custom buttons dynamically into a custom grid layout将自定义按钮动态分配到自定义网格布局中
【发布时间】:2017-02-22 13:41:56
【问题描述】:

我需要显示一个问题以及我从服务器获取的选项列表。每个选项都有一个标题和一个图像,这些选项应该是可点击的。所以我正在创建一个扩展为RelativeLayout 的类ImageButton,每个选项都是一个ImageButton。我还创建了一个类 ImageButtonGroup 扩展为 GridLayout 并将所有 ImageButtons 动态添加到此 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);

这让我得到以下观点:(文本并不总是快乐,如下所示)

如何在网格布局中为这些按钮动态分配固定大小的单元格?

【问题讨论】:

  • 你能放一张你的gridview实际行为的屏幕吗?
  • 更新了实际屏幕。

标签: android android-layout grid-layout


【解决方案1】:

您可以在创建 GridLayoutParams 时指定行和列,以便它自己处理取决于总空间的大小匹配:

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

GridLayout.LayoutParams(GridLayout.Spec rowSpec, GridLayout.Spec 列规范)

为此 rowSpec 构造一个新的 LayoutParams 实例并 列规范。

在您的具体情况下,它将类似于:

    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);

【讨论】:

  • GridLayout.LayoutParams gridParam = new GridLayout.LayoutParams(Math.round(i / 3), i % 3);给出“无法解析构造函数 LayoutParams(int, int)”
  • 是的,我犯了一个错误。您需要使用 Spec 对象传递给构造函数。检查编辑的答案。
  • 这没有效果。我在想体重是否能以某种方式拯救我。但我不确定。
  • 也许吧。我认为这个主题可能会对您的情况有所帮助:stackoverflow.com/questions/10347846/…
【解决方案2】:

我得到了here的提示

我得到了屏幕宽度,用 %age point 计算了我的布局大小(结果是总宽度的 70%),然后除以 3(列数)。所以基本上我所做的是:

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

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 1970-01-01
    • 2015-07-07
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多