如何在Android支持v7 GridLayout中以编程方式将android:layout_columnWeight="1"设置给一个元素?

37

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

我发现自从API 21或使用support 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);
5个回答

36

2
你的回答帮了我很多,当我尝试你的代码时出现了ClassCastException,但是我稍微修改了一下就得到了答案。我把解决方案添加到了我的问题里! - hans_dc

12

-给你了!:>

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

4

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


3
这是否适用于普通的GridLayout,还是需要使用android.support.v7.widget.GridLayout?因为我需要在ScrollView中使用我的GridLayout,但是v7.widget不允许在ScrollView内部使用。但是使用我的普通GridLayout时,它没有起作用。我需要对布局进行其他设置吗? - Aiko West

3

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

0

我曾经遇到过同样的问题,并尝试了很多方法。 我的设计要求如下。 enter image description here

最终,我通过以下方法解决了这个问题。

我在我的xml文件中添加了一个网格布局,如下所示

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
            <GridLayout
                android:id="@+id/gridLayoutBillingInfo"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:columnCount="2">
            </GridLayout>
</RelativeLayout>

然后我为网格布局中的每个项目创建了自定义布局。仅添加TextView不起作用,但将TextView放入布局中则可以正常工作。 请参见以下内容 -

 public class ItemLayout : LinearLayout {

  constructor(context: Context, text:String) :super(context){

    this.orientation = HORIZONTAL
    this.gravity = Gravity.CENTER_VERTICAL


    val param = GridLayout.LayoutParams(
        GridLayout.spec(
            GridLayout.UNDEFINED, GridLayout.FILL, 1f
        ),
        GridLayout.spec(GridLayout.UNDEFINED, GridLayout.FILL, 1f)
    )
    param.height = ViewGroup.LayoutParams.WRAP_CONTENT
    param.width = 0

    this.layoutParams = param

    var textView = TextView(context)
    textView.setText(text)

    this.addView(textView)

  }
}

最后将此项数据添加到网格布局中。 请参见下面 -
   fun addDataToGridLayout{

    val gridLayoutBillingInfo = findViewById<GridLayout>(R.id.gridLayoutBillingInfo)

    val billDetailList : ArrayList<String> = ArrayList()

    billDetailList.add("test data 1")
    billDetailList.add("test data 2")
    billDetailList.add("test data 3")
    billDetailList.add("test data 4")
    billDetailList.add("test data 5")
    billDetailList.add("test data 6")

    billDetailList.forEach {
      gridLayoutBillingInfo.addView(BillItemLayout(context,it))
        
   }

}

希望它能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接