簡體   English   中英

如何以編程方式將 android:layout_columnWeight="1" 設置為 android 支持 v7 Gridlayout 中的元素

[英]How do I set android:layout_columnWeight="1" programmatically to an element in an android support v7 Gridlayout

我正在嘗試以編程方式構建一個包含 2 列的 GirdLayout,我希望這些列的寬度設置為屏幕寬度的一半。

我發現您可以從 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);

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

-這個給你 ! :>

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的這個功能將允許您正確設置權重:

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中包含的視圖。

我遇到了同樣的問題並嘗試了很多東西。 我需要的設計如下。 在此處輸入圖像描述

最后,我通過以下方法解決了這個問題。

我將網格布局添加到我的 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))
        
   }

}

我希望它會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM