2015-07-27 35 views
18

Sto provando a creare un GirdLayout a livello di codice con 2 colonne e voglio che queste colonne abbiano uguale larghezza impostata a metà della larghezza dello schermo.Come faccio a impostare android: layout_columnWeight = "1" a livello di un elemento in un supporto Android v7 Gridlayout

Ho capito che è possibile farlo a partire dall'API 21 o con la vista di supporto v7 GirdLayout. Vedo esempi che utilizza Android: layout_columnWeight = "1" per farlo. Ma non riesco a trovare come farlo a livello di programmazione.

Qualcuno può aiutarmi in questo caso?

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

SOLUZIONE:

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

risposta

15

Ho trovato questo metodo da 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

Così forse si potrebbe provare qualcosa di simile:

((GridLayout.LayoutParams) this.getLayoutParams()).columnSpec = 
    GridLayout.spec(GridLayout.UNDEFINED, 1f); 
+2

La tua risposta mi ha aiutato, ho ricevuto una ClassCastException quando ho provato il tuo codice, ma ho cambiato un po 'per ottenere la risposta. Ho aggiunto la soluzione alla mia domanda! –

0

Questo funzioni di GridLayout.Spec ti consentirà di impostare il peso in modo corretto:

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

utilizzo:

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

-Ecco sei! :>

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

Per chi utilizza xamarin.android, queste risposte mi hanno aiutato, ma ho dovuto modificare leggermente la sintassi. Quindi, se qualcun altro sta usando xamarin.android qui è la sintassi:

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

Dove view è la vista contenuta nel GridLayout.

Problemi correlati