2015-07-27 15 views
18

Próbuję programowo zbudować GirdLayout z 2 kolumnami i chcę, aby te kolumny miały równą szerokość ustawioną na połowie szerokości ekranu.Jak ustawić programowo: layout_columnWeight = "1" programowo do elementu w obsłudze Android v7 Gridlayout

Wyjaśniałem, że możesz to zrobić od API 21 lub z obsługą widoku GirdLayout v7. Widzę przykłady, które korzystają z Androida: layout_columnWeight = "1", aby to zrobić. Ale nie mogę znaleźć sposobu, aby to zrobić programowo.

Czy ktoś może mi pomóc w tej sprawie?

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

ROZWIĄZANIE:

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

Odpowiedz

15

znalazłem tę metodę z 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

Więc może można spróbować czegoś takiego:

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

Twoja odpowiedź pomogła mi, uzyskałem wyjątek ClassCastException, gdy wypróbowałem twój kod, ale zmieniłem go trochę, aby uzyskać odpowiedź. Dodałem rozwiązanie do mojego pytania! –

0

Te funkcje GridLayout.Spec pozwoli ci ustawić prawidłową wagę:

Przykładem
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) 

Wykorzystanie:

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

-Tutaj jesteś! :>

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

Dla tych, którzy używają xamarin.android, te odpowiedzi pomogły mi, ale musiałem zmienić nieco składnię. Więc jeśli ktoś inny korzysta xamarin.android oto składnia:

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

Gdzie view jest pogląd zawarty w GridLayout.