J'ai un GridLayout
avec 5 colonnes et 3 lignes. Maintenant, je peux insérer des vues enfant arbitraires, ce qui est génial. Encore mieux, je peux assigner columnSpan=2
à un élément afin de l'étendre à 2 colonnes (le même avec rowSpan).
Le problème est maintenant que je ne peux pas affecter rowSpan ou columnSpan par programme (c'est-à-dire au moment de l'exécution). Certaines recherches ont suggéré quelque chose comme ceci:
layoutParams.columnSpec = GridLayout.spec(0, columnSpan);
Mais je ne comprends pas très bien ce que signifient les paramètres de spec (début et taille). La documentation est également assez pauvre à ce stade.
Toute aide est grandement appréciée!
OK, j'ai passé quelques heures à comprendre ce qui se passe ici. Eh bien, je n'ai trouvé aucun moyen de définir columnSpan ou rowSpan au moment de l'exécution.
Mais j'ai trouvé une solution qui fonctionne (au moins pour moi):
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"/>
Astuce: Il est très important que vous définissiez l'attribut width et height, before inflate () ajoute la vue à l'élément racine (c'est-à-dire l'élément parent).
J'espère que quelqu'un pourra l'utiliser ;-)
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);
}
Que dis-tu de ça?
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
layoutParams.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getRowSpan());
layoutParams.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getColumnSpan());
Selon la documentation, vous devez également appeler setLayoutParams sur GridLayout SI vous modifiez l'étendue des colonnes ou des lignes APRÈS que les vues enfants sont insérées dans GridLayout. Vous n'en avez pas besoin si vous les ajoutez lors de la définition de la durée
Vous pouvez modifier l'attribut GridLayout layout_rowSpan comme ceci:
// 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);
Je conviens que la documentation doit être améliorée un peu à cet égard.
Je modifie la portée de la colonne d'environ 2 cellules par programme et après gonfle par ce code:
GridLayout.LayoutParams itemLP = (GridLayout.LayoutParams)gridItemV.getLayoutParams();
itemLP.columnSpec = GridLayout.spec(0, 2);
gridItemV.setLayoutParams(itemLP);
l'important est d'appeler setLayoutParams
après le changement columnSpec
j'espère que cela vous aidera aussi