如何在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
相关产品推荐
相关产品推荐

