web-dev-qa-db-fra.com

Comment définir Android: layout_columnWeight = "1" par programme sur un élément dans un Android supporte la grille v7 Gridlayout

J'essaie de construire un GirdLayout par programme avec 2 colonnes et je veux que ces colonnes aient une largeur égale à la moitié de la largeur de l'écran.

J'ai compris que vous pouvez le faire depuis l'API 21 ou avec la vue GirdLayout de la prise en charge v7. Je vois des exemples qui utilisent Android: layout_columnWeight = "1" pour ce faire. Mais je ne trouve pas comment procéder par programme.

Quelqu'un peut-il m'aider sur cette question?

package com.tunify.v3.component;

import Java.util.ArrayList;

import Android.support.v7.widget.GridLayout;
import Android.util.DisplayMetrics;
import Android.util.TypedValue;
import Android.view.ViewGroup;

import com.tunify.asme.data.ChangeableSelectionParameterValue;

public class ChangeableSelectionParameters extends GridLayout{

//private ArrayList<ChangeableSelectionParameterView> selectionParameterViews;
private ArrayList<ChangeableSelectionParameterValue> selectionParameterValues;

private static final int ITEM_PADDING_LEFT_DP = 0;
private static final int ITEM_PADDING_RIGHT_DP = 0;
private static final int ITEM_PADDING_TOP_DP = 0;
private static final int ITEM_PADDING_BOTTOM_DP = 0;

//private static final int MUSICCOLLECTION_DISPLAY_TEXT_SIZE_SP = 15;


public ChangeableSelectionParameters(Android.content.Context context, ArrayList<ChangeableSelectionParameterValue> selectionParameterValues) {
    super(context);

    this.selectionParameterValues = selectionParameterValues;

    initializeLayoutBasics(context);
    initializeComponents();
}

private void initializeLayoutBasics(Android.content.Context context) {
    setOrientation(VERTICAL);
    setColumnCount(2);
    setRowCount((int)Math.ceil(selectionParameterValues.size()/2.0));

    int width = ViewGroup.LayoutParams.MATCH_PARENT;
    int height = ViewGroup.LayoutParams.WRAP_CONTENT;
    Android.view.ViewGroup.LayoutParams layoutParams = new Android.view.ViewGroup.LayoutParams(width, height);
    this.setLayoutParams(layoutParams);

    DisplayMetrics metrics = getResources().getDisplayMetrics();

    int paddingLeftPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ITEM_PADDING_LEFT_DP, metrics);
    int paddingRightPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ITEM_PADDING_RIGHT_DP, metrics);
    int paddingTopPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ITEM_PADDING_TOP_DP, metrics);
    int paddingBottomPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ITEM_PADDING_BOTTOM_DP, metrics);
    setPadding(paddingLeftPx, paddingTopPx, paddingRightPx, paddingBottomPx);

}

private void initializeComponents() {

    for(ChangeableSelectionParameterValue param : this.selectionParameterValues){
        ChangeableSelectionParameterView v = new ChangeableSelectionParameterView(getContext(), param);
        //TODO set views layout column weight to 1
        this.addView(v);
    }
 }
}

SOLUTION:

 GridLayout.LayoutParams parem = new LayoutParams(GridLayout.spec(GridLayout.UNDEFINED, 1f),      GridLayout.spec(GridLayout.UNDEFINED, 1f));
 v.setLayoutParams(parem);
29
hans_dc

J'ai trouvé cette méthode à partir de GridLayout: http://grepcode.com/file/repository.grepcode.com/Java/ext/com.google.Android/android/5.0.0_r1/Android/widget/GridLayout.Java # GridLayout.spec% 28int% 2Cfloat% 29

Alors peut-être pourriez-vous essayer quelque chose comme ça:

((GridLayout.LayoutParams) this.getLayoutParams()).columnSpec =
    GridLayout.spec(GridLayout.UNDEFINED, 1f);
27
vilpe89

-Vous voilà ! :>

Button button = new Button(this);
GridLayout.LayoutParams param= new GridLayout.LayoutParams(GridLayout.spec(
            GridLayout.UNDEFINED,GridLayout.FILL,1f),
            GridLayout.spec(GridLayout.UNDEFINED,GridLayout.FILL,1f));
param.height = 0;                                                                                                           
param.width = 0;
button.setLayoutParams(param);
4
Nguyen Hoà

Pour tous ceux qui utilisent xamarin.Android, ces réponses m'ont aidé, mais j'ai dû changer un peu la syntaxe. Donc, si quelqu'un d'autre utilise xamarin.Android, voici la syntaxe:

GridLayout.LayoutParams param = new GridLayout.LayoutParams();
param.RowSpec = GridLayout.InvokeSpec(GridLayout.Undefined, 1f);
param.ColumnSpec = GridLayout.InvokeSpec(GridLayout.Undefined, 1f);
view.LayoutParameters = param;

view est la vue contenue dans le GridLayout.

1
Ian Parry

Ces fonctions de GridLayout.Spec vous permettront de régler correctement le poids:

public static Spec spec(int start, int size, Alignment alignment, float weight)
public static Spec spec(int start, Alignment alignment, float weight)
public static Spec spec(int start, int size, float weight) 
public static Spec spec(int start, float weight)

exemple d'utilisation:

((LayoutParams) gm.getViewFromGridCoords(i, j).getLayoutParams()).columnSpec = GridLayout.spec(j, span, CENTER, 1);
1
AndrewBloom