如何以编程方式将android:layout_columnWeight =“1”设置为android支持v7 Gridlayout中的元素

我正在尝试以编程方式使用2列构建GirdLayout,并且我希望这些列的宽度设置为屏幕宽度的一半。

我想你可以从API 21或支持v7 GirdLayout视图执行此操作。 我看到使用android:layout_columnWeight =“1”的示例来执行此操作。 但我无法find如何以编程方式执行此操作。

任何人都可以帮我解决这个问题吗?

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 selectionParameterViews; private ArrayList 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 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); 

    我在GridLayout中find了这个方法: 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); 

    -这个给你 ! :>

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

    GridLayout.Spec的这个function将允许您正确设置权重:

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

    对于任何使用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中包含的视图。