5列3行のGridLayout
があります。これで、任意の子ビューを挿入できます。これは素晴らしいことです。さらに良いことは、columnSpan=2
いくつかのアイテムを2列に広げるために(rowSpanと同じ)。
問題は、rowSpanまたはcolumnSpanをプログラムで(つまり実行時に)割り当てることができないことです。いくつかの検索で次のようなことが示唆されました。
layoutParams.columnSpec = GridLayout.spec(0, columnSpan);
しかし、specのパラメーター(開始とサイズ)の意味がよくわかりません。ドキュメントもこの時点では非常に貧弱です。
どんな助けも大歓迎です!
OK、ここで何が起こっているのかを理解するのに数時間費やしました。さて、実行時にcolumnSpanまたはrowSpanを設定する作業方法は見つかりませんでした。
しかし、私は(少なくとも私にとっては)動作する解決策を見つけました:
private LinearLayout addNewSpannedView(Integer resourceId, ViewGroup rootElement) {
return (LinearLayout) ((ViewGroup) getLayoutInflater().inflate(resourceId, rootElement, true)).getChildAt(rootElement.getChildCount() - 1);
}
// set columnSpan depending on some logic (gridLayout is the layout to add the view's to -> in my case these are LinearLayouts)
shape = addNewSpannedView(columnSpan == 1 ? R.layout.grid_ll_col_span_1 : R.layout.grid_ll_col_span_2, gridLayout);
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="@dimen/shapeWidth"
Android:layout_height="wrap_content"
Android:layout_columnSpan="2"/>
ヒント:幅と高さの属性を設定することは非常に重要です。before inflate()はビューをルート要素(つまり、親要素)に追加します。
私は誰かがこれを使用できることを願っています;-)
GridLayout gridLayout = (GridLayout)findViewById(R.id.tableGrid);
gridLayout.removeAllViews();
int total = 12;
int column = 5;
int row = total / column;
gridLayout.setColumnCount(column);
gridLayout.setRowCount(row + 1);
for(int i =0, c = 0, r = 0; i < total; i++, c++)
{
if(c == column)
{
c = 0;
r++;
}
ImageView oImageView = new ImageView(this);
oImageView.setImageResource(R.drawable.ic_launcher);
GridLayout.LayoutParams param =new GridLayout.LayoutParams();
param.height = LayoutParams.WRAP_CONTENT;
param.width = LayoutParams.WRAP_CONTENT;
param.rightMargin = 5;
param.topMargin = 5;
param.setGravity(Gravity.CENTER);
param.columnSpec = GridLayout.spec(c);
param.rowSpec = GridLayout.spec(r);
oImageView.setLayoutParams (param);
gridLayout.addView(oImageView);
}
これはどう?
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
layoutParams.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getRowSpan());
layoutParams.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getColumnSpan());
ドキュメントによると、子ビューがGridLayoutに挿入された後に列または行のスパンを変更する場合は、GridLayoutでsetLayoutParamsも呼び出す必要があります。スパンの設定中に追加する場合、これは必要ありません。
GridLayoutのlayout_rowSpan属性を次のように変更できます。
// View allocated in first row and first column
View child = findViewById(R.id.row0column0);
GridLayout.LayoutParams params =
new GridLayout.LayoutParams(child.getLayoutParams());
params.rowSpec = GridLayout.spec(0, 2); // First cell in first row use rowSpan 2.
params.columnSpec = GridLayout.spec(0, 2); // First cell in first column use columnSpan 2.
child.setLayoutParams(params);
この点に関しては、ドキュメントを少し改善する必要があることに同意します。
私はプログラムで列のスパンを約2セル変更し、このコードでafter inflateします:
GridLayout.LayoutParams itemLP = (GridLayout.LayoutParams)gridItemV.getLayoutParams();
itemLP.columnSpec = GridLayout.spec(0, 2);
gridItemV.setLayoutParams(itemLP);
重要なのは、変更後setLayoutParams
を呼び出すcolumnSpec