如何在相对度量中指定Android GridLayout单元格的宽度和高度?

时间:2013-01-24 11:48:46

标签: android android-layout

我正在试图找出GridLayout是如何工作的,但是我从文档中无法弄清楚的一件事是如何或者如果可以控制网格单元的大小。

假设我想要一个两个两个网格,其中每个单元格占据屏幕空间的25%(半高,半宽) - 我可以这样做吗?

使用LinearLayout,我可以通过在一个垂直中嵌套两个水平LinearLayout,然后为所有元素分配 weight 为1来实现此目的。 GridLayout虽然不支持权重属性。

5 个答案:

答案 0 :(得分:17)

有两个属性android:layout_columnWeight和layout_rowWeight,它的工作方式与LinearLayout中的layout_weight类似。这在API 21中受支持。对于较旧的Android设备,请使用v7支持库中的GridLayout。

这些属性允许您根据分配给每列的值调整列的宽度/高度。公式如下(column_weight / sum_of_column_weight)* gridLayout_width = column_width。

这是一个示例,它是一个2行2列均匀展开的网格视图,每个占用网格重量和高度的50%。

<GridLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="2"
>

    <TextView
        android:text="SEARCH FEE"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
     />

    <TextView
        android:layout_columnWeight="1"
        android:text="SEARCH FEE"
        android:layout_rowWeight="1"
     />

    <TextView
        android:text="SEARCH FEE"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        />

    <TextView
        android:layout_columnWeight="1"
        android:text="SEARCH FEE"
        android:layout_rowWeight="1"
        />
</GridLayout>

答案 1 :(得分:10)

根据文档,它看起来像你想要的那样设置应该相当简单:

android:rowCount='2'
android:columnCount='2'

并在子集中

android:layout_columnSpan="1"
android:layout_rowSpan="1"

This参考也提到拉伸:

  

要防止色谱柱拉伸,请确保色谱柱中的某个组分未定义重力。

这似乎是一种解决方案,可以保持行和列的比例为50:50,而无需根据内容调整大小

答案 2 :(得分:7)

这将是这样的:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:columnCount="2"
    app:rowCount="2">

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="1"
        app:layout_columnWeight="1"
        app:layout_rowWeight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="2"
        app:layout_columnWeight="1"
        app:layout_rowWeight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="3"
        app:layout_columnWeight="1"
        app:layout_rowWeight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="4"
        app:layout_columnWeight="1"
        app:layout_rowWeight="1" />

</android.support.v7.widget.GridLayout>

答案 3 :(得分:2)

GridLayout中有一个帮助方法:

GridLayout.LayoutParams params = new GridLayout.LayoutParams();
            params.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1, getAlignment(Gravity.NO_GRAVITY, true), 1);
item.setLayoutParams(params);

private GridLayout.Alignment getAlignment(int gravity, boolean horizontal) {
        int mask = horizontal ? HORIZONTAL_GRAVITY_MASK : VERTICAL_GRAVITY_MASK;
        int shift = horizontal ? AXIS_X_SHIFT : AXIS_Y_SHIFT;
        int flags = (gravity & mask) >> shift;
        switch (flags) {
            case (AXIS_SPECIFIED | AXIS_PULL_BEFORE):
                return horizontal ? LEFT : TOP;
            case (AXIS_SPECIFIED | AXIS_PULL_AFTER):
                return horizontal ? RIGHT : BOTTOM;
            case (AXIS_SPECIFIED | AXIS_PULL_BEFORE | AXIS_PULL_AFTER):
                return FILL;
            case AXIS_SPECIFIED:
                return CENTER;
            case (AXIS_SPECIFIED | AXIS_PULL_BEFORE | GravityCompat.RELATIVE_LAYOUT_DIRECTION):
                return START;
            case (AXIS_SPECIFIED | AXIS_PULL_AFTER | GravityCompat.RELATIVE_LAYOUT_DIRECTION):
                return END;
            default:
                return GridLayout.FILL;
        }
    }

通常这只是思想反思。

小版本:

params.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1, GridLayout.FILL, 1);

答案 4 :(得分:-1)

我使用以下尺寸制作了自己的3 * 3板用于tic tac toe。 此代码用于第一行。我对其他行也做了同样的事情。

import pycurl
import re
import io
import json
import requests

data = {"to" : "fC6xEWZwcu0:APA91xxx",  "priority" : "high",  "notification" : {    "body" : "Background Message",    "title" : "BG Title", "sound" : "sound.mp3"},  "data" : {    "title" : "FG Title",    "message" : "Foreground Message"  }}

buffer = io.BytesIO()
c = pycurl.Curl()

c.setopt(c.URL, 'https://fcm.googleapis.com/fcm/send')
c.setopt(c.POST, True)
c.setopt(c.SSL_VERIFYPEER, False)

c.setopt(pycurl.HTTPHEADER, [
    'Content-type:application/json charset=utf-8',
    'Content-Length:0'
    'Authorization: Basic key=AAAAWuduLSU:APA91bEStixxx'
])

c.setopt(c.WRITEDATA, buffer)

'''
c.setopt(pycurl.HTTPBODY, [
    'test:test'

])
'''

print(buffer)
# c.setopt(c.HEADERFUNCTION, header_function)

c.perform()

print('\n\nStatus: %d' % c.getinfo(c.RESPONSE_CODE))
print('TOTAL_TIME: %f' % c.getinfo(c.TOTAL_TIME))

c.close()
body = buffer.getvalue()

print(body)