【问题标题】:How to use GridLayout.Spec for a column extending multiple rows?如何将 GridLayout.Spec 用于扩展多行的列?
【发布时间】:2016-06-25 19:01:10
【问题描述】:

我正在尝试动态创建一个包含 2 行 4 列的表。但是每种情况下的行和列的大小不应该相同。或许我会附上一张图片:

我想要:

据我了解,当我不使用 XML 标记来实现此目的时,使用 setLayoutParams 中的 GridLayout.Spec

但是我不明白需要在 GridLayout.Spec 中传递哪些参数?

如果我想将第一行的第一列和第二行的第一列合并,我应该在里面指定什么

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

?

什么是规范?

我看到了therethere 的例子,但不完全理解它是如何工作的。

如果在 XML 标记的情况下我可以使用 layout_rowSpan 和 layout_columnSpan 来合并行或列,那么如何动态地进行呢?

【问题讨论】:

    标签: android android-layout android-gridlayout


    【解决方案1】:

    查看下面的代码以获得您正在寻找的布局。添加了注释以解释 GridLayout.Spec 创建中使用的值。

    // simple grid layout with WRAP_CONTENT width and height
    GridLayout gridLayout = (GridLayout) findViewById(R.id.grid_layout);
    
    // face view takes 2 rows, 1 column -- zero index based
    GridLayout.Spec faceRow = GridLayout.spec(0, 2); // starts row 0, takes 2 rows
    GridLayout.Spec faceCol = GridLayout.spec(0); // starts col 0, takes 1 col
    
    GridLayout.Spec titleRow = GridLayout.spec(0); // starts row 0, takes 1 row
    GridLayout.Spec titleCol = GridLayout.spec(1, 3); // starts col 1, takes 3 cols
    
    GridLayout.Spec plusRow = GridLayout.spec(1); // starts row 1, takes 1 row
    GridLayout.Spec plusCol = GridLayout.spec(1); // starts col 1, takes 1 col
    
    GridLayout.Spec minusRow = GridLayout.spec(1); // starts row 1, takes 1 row
    GridLayout.Spec minusCol = GridLayout.spec(2); // starts col 1, takes 1 col
    
    GridLayout.Spec checkRow = GridLayout.spec(1); // starts row 1, takes 1 row
    GridLayout.Spec checkCol = GridLayout.spec(3); // starts col 1, takes 1 col
    
    // create the LayoutParams using our row/col for each view
    GridLayout.LayoutParams faceParams = new GridLayout.LayoutParams(faceRow, faceCol);
    faceParams.setGravity(Gravity.FILL_VERTICAL); // fill vertical so we take up the full 2 rows
    // dummy text views to fill some space
    TextView faceText = new TextView(this);
    faceText.setPadding(32, 32, 32, 32); // add some random padding to make the views bigger
    faceText.setLayoutParams(faceParams);
    faceText.setText("FACE");
    faceText.setGravity(Gravity.CENTER);
    faceText.setBackgroundColor(Color.RED);
    gridLayout.addView(faceText, faceParams);
    
    GridLayout.LayoutParams titleParams = new GridLayout.LayoutParams(titleRow, titleCol);
    titleParams.setGravity(Gravity.FILL_HORIZONTAL); // fill horizontal so we take up the full 3 columns
    TextView titleText = new TextView(this);
    titleText.setPadding(32, 32, 32, 32);
    titleText.setLayoutParams(titleParams);
    titleText.setText("TITLE");
    titleText.setGravity(Gravity.CENTER);
    titleText.setBackgroundColor(Color.BLUE);
    gridLayout.addView(titleText, titleParams);
    
    GridLayout.LayoutParams minusParams = new GridLayout.LayoutParams(minusRow, minusCol);
    TextView minusText = new TextView(this);
    minusText.setPadding(32, 32, 32, 32);
    minusText.setLayoutParams(minusParams);
    minusText.setText("MIN");
    minusText.setGravity(Gravity.CENTER);
    minusText.setBackgroundColor(Color.YELLOW);
    gridLayout.addView(minusText, minusParams);
    
    GridLayout.LayoutParams plusParams = new GridLayout.LayoutParams(plusRow, plusCol);
    TextView plusText = new TextView(this);
    plusText.setPadding(32, 32, 32, 32);
    plusText.setLayoutParams(plusParams);
    plusText.setText("PLS");
    plusText.setGravity(Gravity.CENTER);
    plusText.setBackgroundColor(Color.GREEN);
    gridLayout.addView(plusText, plusParams);
    
    GridLayout.LayoutParams checkParams = new GridLayout.LayoutParams(checkRow, checkCol);
    TextView checkText = new TextView(this);
    checkText.setPadding(32, 32, 32, 32);
    checkText.setLayoutParams(faceParams);
    checkText.setText("CHK");
    checkText.setGravity(Gravity.CENTER);
    checkText.setBackgroundColor(Color.MAGENTA);
    gridLayout.addView(checkText, checkParams);
    

    希望这有助于理解GridLayout.Spec

    【讨论】:

    • 我会向上帝祈祷,您已经去 Google 工作并编写了开发者指南。现在我明白它是如何工作的了!谢谢。
    • 没问题!如果它回答了您的问题,请务必将其标记为已接受的答案:)
    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多