web-dev-qa-db-fra.com

Définir rowSpan ou colSpan d'un enfant d'un GridLayout par programme?

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!

29
The_Unknown

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

Code Java

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

grid_ll_col_span_2.xml

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

3
The_Unknown
    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);
    }

 have look on this image - you can change number of rows and column as you need

45
Nikhil Pingle

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

14
chpasha

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.

9
Sid Morad

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

4
m1uan