Android Studio中实现7行16列桌游棋盘容器应选用什么组件?
7行16列无滚动桌游棋盘实现方案
优先推荐:AndroidX GridLayout
这是最匹配你需求的容器,原生支持固定行列配置,默认无滚动,可自动适配父容器大小均分所有格子:
- 第一步:在模块级
build.gradle中引入依赖(未引入时需要添加):implementation "androidx.gridlayout:gridlayout:1.0.0" - 第二步:布局文件中配置GridLayout基础属性,固定行列数:
如果需要保持棋盘16:7的比例避免拉伸,可以外层套ConstraintLayout,给GridLayout加属性<androidx.gridlayout.widget.GridLayout android:id="@+id/boardGrid" android:layout_width="match_parent" android:layout_height="match_parent" app:columnCount="16" app:rowCount="7" />app:layout_constraintDimensionRatio="16:7" - 第三步:代码中加载112个元素生成格子:
遍历你的数组,给每个元素生成对应的格子View,将LayoutParams的宽高设为0dp,横竖权重都设为1,所有格子会自动均分整个棋盘空间:val grid = findViewById<GridLayout>(R.id.boardGrid) yourDataArray.forEachIndexed { index, content -> val cellView = TextView(this) // 可替换为自定义格子View cellView.text = content // 配置格子布局参数 val params = GridLayout.LayoutParams().apply { width = 0 height = 0 columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f) rowSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f) } cellView.layoutParams = params // 这里可以加格子选中逻辑、点击事件等 grid.addView(cellView) }
备选方案:ConstraintLayout Flow
如果后续需要支持格子跨列/跨行等特殊布局规则,可以用ConstraintLayout的Flow辅助类实现:
- 布局中配置Flow,设置每行最多16个元素,自动换行:
<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.constraintlayout.helper.widget.Flow android:id="@+id/boardFlow" android:layout_width="match_parent" android:layout_height="match_parent" app:flow_maxElementsWrap="16" app:flow_horizontalGap="2dp" app:flow_verticalGap="2dp" app:flow_wrapMode="aligned" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> - 代码中生成112个格子View后,调用
flow.addViews(*cellViewArray)即可自动按16列7行排列,无滚动。
现有GridView方案兼容修改
如果不想改动现有ArrayAdapter逻辑,可以修改GridView强制不滚动,适配全屏展示:
- 自定义可扩展GridView,重写onMeasure方法:
class NoScrollGridView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : GridView(context, attrs) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val expandSpec = MeasureSpec.makeMeasureSpec(Int.MAX_VALUE shr 2, MeasureSpec.AT_MOST) super.onMeasure(widthMeasureSpec, expandSpec) } } - 布局中用这个自定义NoScrollGridView替换原生GridView,设置高度为wrap_content即可完全展示所有格子,无滚动。该方案适配性不如前两种,仅建议临时兼容使用。
内容的提问来源于stack exchange,提问作者green tea
相关产品推荐
相关产品推荐

