2015-07-27 2 views
18

Я пытаюсь создать GirdLayout программно с 2 столбцами, и я хочу, чтобы эти столбцы имели равную ширину, равную половине ширины экрана.Как установить android: layout_columnWeight = "1" программно в элемент поддержки android v7 Gridlayout

Я понял, что вы можете сделать это с API 21 или с поддержкой v7 GirdLayout. Я вижу примеры, которые используют android: layout_columnWeight = "1" для этого. Но я не могу найти, как это сделать программно.

Может ли кто-нибудь помочь мне в этом вопросе?

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

РЕШЕНИЕ:

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

ответ

15

Я нашел этот метод из 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

Так что, может быть, вы могли бы попробовать что-то вроде этого:

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

Ваш ответ помог мне, я получил ClassCastException, когда я попробовал свой код, но немного изменил его, чтобы получить ответ. Я добавил решение на мой вопрос! –

0

Эти функции из GridLayout.Spec позволит вам правильно установить вес:

Пример
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) 

использование:

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

-Вот вы! :>

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

Для тех, кто использует xamarin.android, эти ответы мне помогли, но мне пришлось немного изменить синтаксис. Так что если кто-то использует xamarin.android здесь синтаксис:

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

view Где это мнение содержится в GridLayout.