如何以编程方式添加GridLayout子项的layout_columnWeight?

时间:2016-02-24 11:06:55

标签: java android android-gridlayout

我想使用GridLayout(不是GridView)作为象棋或棋子等游戏的棋盘。由于我有点不愿意使用带有64个子View的xml文件,我尝试以编程方式添加它们。

为了简单起见,我开始使用TextView作为View的{​​{1}}个孩子{/ 1}}。

我的问题是GridLayout没有均匀分布,我不知道如何在我的java代码中获得均匀分布。设置Viewlayout_columnWeight没有类似“setWeight()”的方法。

目前,这是我的 activity_dynamic_grid_layout.xml

layout_rowWeight

我已将<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="80dp" android:id="@+id/ivLogo" android:background="#ff0000" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"/> <android.support.v7.widget.GridLayout android:id="@+id/grid_layout" android:background="#004080" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/ivLogo" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="36dp"> </android.support.v7.widget.GridLayout> 宽度和高度设置为GridLayout,但我在运行时使用match_parent更改它们以获得方板。这样做,彩色背景显示正方形空间。

我的 onCreate()

ViewTreeObserver.OnPreDrawListener

我已经尝试过了:

我在布局文件中放了一个@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dynamic_grid_layout); GridLayout gl = (GridLayout) findViewById(R.id.grid_layout); gl.setColumnCount(8); gl.setRowCount(8); for(int i=0; i<gl.getRowCount(); i++) { GridLayout.Spec rowSpec = GridLayout.spec(i, 1, GridLayout.FILL); for(int j=0;j<gl.getColumnCount();j++) { GridLayout.Spec colSpec = GridLayout.spec(j,1, GridLayout.FILL); TextView tvChild = new TextView(this); tvChild.setText("[ " + i + " | " + j + " ]"); tvChild.setTextSize(18f); tvChild.setTextColor(Color.WHITE); tvChild.setGravity(Gravity.CENTER); GridLayout.LayoutParams myGLP = new GridLayout.LayoutParams(); myGLP.rowSpec = rowSpec; myGLP.columnSpec = colSpec; gl.addView(tvChild, myGLP ); } } final View rootView = findViewById(R.id.dynamic_root); rootView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { int w = rootView.getMeasuredWidth(); int h = rootView.getMeasuredHeight(); int min = Math.min(w, h); ViewGroup.LayoutParams lp = gl.getLayoutParams(); lp.width = min - min % 9; lp.height = lp.width; gl.setLayoutParams(lp); rootView.getViewTreeObserver().removeOnPreDrawListener(this); return true; } }); } 子项,并尝试从TextView复制layout_columnWeightlayout_rowWeight

GridLayout.LayoutParams

双循环之前 <android.support.v7.widget.GridLayout ...> <TextView android:id="@+id/clone_my_params" android:text="[ 0 | 0 ]" android:textColor="#ffffff" android:textSize="18sp" app:layout_column="0" app:layout_row="0" app:layout_columnWeight="1" app:layout_rowWeight="1" /> </android.support.v7.widget.GridLayout> 中的附加代码:

onCreate()

在循环内部,我跳过(i,j)=(0,0)并更改了

TextView v = (TextView)gl.findViewById(R.id.clone_my_params);
v.setGravity(Gravity.CENTER);
GridLayout.LayoutParams gridLayoutParamsToCopy = new GridLayout.LayoutParams(v.getLayoutParams());

 GridLayout.LayoutParams myGLP = new GridLayout.LayoutParams();

在更改之前,所有元素都在左上角,多余的空间被赋予最后一行/列。更改后,第一行/列有多余的空间,其他元素没有变化。

双循环后调用 GridLayout.LayoutParams myGLP = new GridLayout.LayoutParams(gridLayoutParamsToCopy); 和/或gl.invalidate()无效。

所以我似乎无法通过使用复制构造函数来设置所需的权重。

2 个答案:

答案 0 :(得分:4)

- 你在这里!产品:&gt;

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

答案 1 :(得分:1)

要设置Gridlayout子项的权重,请使用带有浮点值的spec()(如此one)方法之一。

另一种方法是制作自定义视图(在这种情况下,您需要手动绘制碎片)或自定义ViewGroup(在这种情况下,自定义ViewGroup将只处理碎片定位,这将是如果您计划拥有比简单TextView更复杂的视图层次结构,那么这是合适的。