rowspan - gridlayout android example
¿Cómo configuro android: layout_columnWeight="1" programáticamente para un elemento en un soporte de Android v7 Gridlayout (4)
-Aquí estás ! :>
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);
Estoy tratando de construir un GirdLayout programáticamente con 2 columnas y quiero que estas columnas tengan el mismo ancho establecido en la mitad del ancho de la pantalla.
Me di cuenta de que puedes hacer esto desde API 21 o con la vista GirdLayout de v7 de soporte. Veo ejemplos que usan android: layout_columnWeight = "1" para hacer esto. Pero no puedo encontrar cómo hacer esto programáticamente.
¿Alguien puede ayudarme con este asunto?
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);
}
}
}
SOLUCIÓN:
GridLayout.LayoutParams parem = new LayoutParams(GridLayout.spec(GridLayout.UNDEFINED, 1f), GridLayout.spec(GridLayout.UNDEFINED, 1f));
v.setLayoutParams(parem);
Encontré este método en 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
Así que tal vez podrías probar algo como esto:
((GridLayout.LayoutParams) this.getLayoutParams()).columnSpec =
GridLayout.spec(GridLayout.UNDEFINED, 1f);
Estas funciones de GridLayout.Spec le permitirán establecer el peso correctamente:
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)
ejemplo de uso:
((LayoutParams) gm.getViewFromGridCoords(i, j).getLayoutParams()).columnSpec = GridLayout.spec(j, span, CENTER, 1);
Para cualquiera que use xamarin.android, estas respuestas me ayudaron, pero tuve que cambiar un poco la sintaxis. Entonces, si alguien más está usando xamarin.android, aquí está la sintaxis:
GridLayout.LayoutParams param = new GridLayout.LayoutParams();
param.RowSpec = GridLayout.InvokeSpec(GridLayout.Undefined, 1f);
param.ColumnSpec = GridLayout.InvokeSpec(GridLayout.Undefined, 1f);
view.LayoutParameters = param;
Donde view
es la vista contenida en GridLayout.