【问题标题】:How do I set android:layout_columnWeight="1" programmatically to an element in an android support v7 Gridlayout如何以编程方式将 android:layout_columnWeight="1" 设置为 android 支持 v7 Gridlayout 中的元素
【发布时间】:2022-05-10 15:29:33
【问题描述】:

我正在尝试以编程方式构建一个包含 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);

【问题讨论】:

    标签: android android-gridlayout android-layout-weight


    【解决方案1】:

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

    【讨论】:

    • 您的回答对我有帮助,我在尝试您的代码时遇到了 ClassCastException,但为了得到答案而对其进行了一些更改。我为我的问题添加了解决方案!
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这适用于普通的 GridLayout 还是我需要使用 android.support.v7.widget.GridLayout。因为我需要在 ScrollView 中使用我的 GridLayout,但是在 ScrollView 中不允许使用 v7.widget。但是对于我正常的 GridLayout,它不起作用。我需要为布局设置任何其他设置吗?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题并尝试了很多东西。 我需要的设计如下。

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

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

        }

        我希望它会有所帮助。

        【讨论】:

          猜你喜欢
          • 2014-08-30
          • 1970-01-01
          • 2014-04-22
          • 1970-01-01
          • 2017-07-14
          • 2016-10-25
          • 1970-01-01
          • 2014-10-09
          • 1970-01-01
          相关资源
          最近更新 更多