You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android GridLayout中动态添加等尺寸子视图实现全屏网格?

嘿,我完全懂你的需求——一个占满整个屏幕、单元格大小完全一致的可变尺寸网格,而且选GridLayout绝对是正确的决定,毕竟TableLayout应对动态行列变化太死板,GridView和RecyclerView又没必要(毕竟不需要滚动)。我之前也踩过GridLayout.Spec的坑,现在给你整理了清晰的Java和Kotlin实现示例,帮你彻底搞懂怎么用!

实现步骤

1. 基础布局XML

首先在布局文件里定义一个占满屏幕的GridLayout,你可以先设置默认的行列数,之后代码里也能动态修改:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/grid_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="10"
    android:rowCount="4"/>

2. Kotlin代码实现

下面是完整的Kotlin代码,你可以直接修改ROW_COUNT和COLUMN_COUNT来调整网格尺寸:

import android.graphics.Color
import android.os.Bundle
import android.widget.GridLayout
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    // 这里可以灵活修改网格的行列数
    private val ROW_COUNT = 4
    private val COLUMN_COUNT = 10

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val gridLayout = findViewById<GridLayout>(R.id.grid_layout)
        // 动态覆盖XML里的行列数(可选,如果你想完全在代码里控制)
        gridLayout.rowCount = ROW_COUNT
        gridLayout.columnCount = COLUMN_COUNT

        // 遍历创建每个单元格
        for (row in 0 until ROW_COUNT) {
            for (col in 0 until COLUMN_COUNT) {
                // 创建单元格View,这里用LinearLayout示例,你可以换成任意View(比如TextView)
                val cell = LinearLayout(this)
                // 设置随机背景色
                cell.setBackgroundColor(getRandomColor())

                // 关键:创建行列Spec,第二个参数是权重(设为1f表示均分空间)
                val rowSpec = GridLayout.spec(row, 1f)
                val colSpec = GridLayout.spec(col, 1f)

                // 创建LayoutParams,必须把宽高设为0,让权重生效
                val params = GridLayout.LayoutParams(rowSpec, colSpec)
                params.width = 0
                params.height = 0

                // 添加到GridLayout中
                gridLayout.addView(cell, params)
            }
        }
    }

    // 生成随机颜色的工具方法
    private fun getRandomColor(): Int {
        val red = (0..255).random()
        val green = (0..255).random()
        val blue = (0..255).random()
        return Color.rgb(red, green, blue)
    }
}

3. Java代码实现

如果用Java开发,对应的实现如下:

import android.graphics.Color;
import android.os.Bundle;
import android.widget.GridLayout;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Random;

public class MainActivity extends AppCompatActivity {
    // 可灵活修改的网格尺寸
    private static final int ROW_COUNT = 4;
    private static final int COLUMN_COUNT = 10;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GridLayout gridLayout = findViewById(R.id.grid_layout);
        // 动态设置行列数
        gridLayout.setRowCount(ROW_COUNT);
        gridLayout.setColumnCount(COLUMN_COUNT);

        Random random = new Random();

        // 遍历创建每个单元格
        for (int row = 0; row < ROW_COUNT; row++) {
            for (int col = 0; col < COLUMN_COUNT; col++) {
                LinearLayout cell = new LinearLayout(this);
                // 设置随机背景色
                int red = random.nextInt(256);
                int green = random.nextInt(256);
                int blue = random.nextInt(256);
                cell.setBackgroundColor(Color.rgb(red, green, blue));

                // 创建行列Spec:第一个参数是起始位置,第二个是权重
                GridLayout.Spec rowSpec = GridLayout.spec(row, 1f);
                GridLayout.Spec colSpec = GridLayout.spec(col, 1f);

                // 创建LayoutParams,宽高设为0让权重生效
                GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpec, colSpec);
                params.width = 0;
                params.height = 0;

                gridLayout.addView(cell, params);
            }
        }
    }
}
关键知识点解析
  • GridLayout.Spec的作用:这个类用来定义子View在网格中的位置和空间分配规则。第二个参数是weight(权重),设为1f表示该行/列的所有子View会均分该行/列的可用空间,这是实现单元格大小一致的核心。
  • 必须设置宽高为0:如果不把LayoutParams的width和height设为0,GridLayout会优先使用View的wrap_content或match_parent属性,权重就不会生效,也就无法均分空间。
  • 动态修改网格尺寸:只需要修改ROW_COUNT和COLUMN_COUNT的值,代码会自动生成对应数量的单元格,完全满足你未来变更网格尺寸的需求。
  • 可选:添加单元格间距:如果想让单元格之间有间隙,可以给LayoutParams设置边距,比如params.setMargins(dpToPx(2), dpToPx(2), dpToPx(2), dpToPx(2)),记得写一个dp转px的工具方法来适配不同屏幕。

内容的提问来源于stack exchange,提问作者BadCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:13:33