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

Kotlin动态生成GridLayout失败:点击按钮未添加行列

问题:GridLayout点击按钮后不生成行列

我用Kotlin开发时要实现这个功能:获取用户输入的数字,将其设为GridLayout的rowCount和columnCount,生成对应数量的行列,每个单元格填充1-10的随机数。但点击按钮后GridLayout完全没变化,试过调整布局大小、启用ViewBinding都没用。


布局代码

GridLayout部分

<GridLayout
        android:id="@+id/gridLyt"
        style="@style/GridBorder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="@id/gridLyt2"
        app:layout_constraintTop_toBottomOf="@id/linearLyt">

顶部LinearLayout(含输入框和按钮)

<LinearLayout
        android:id="@+id/linearLyt"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:orientation="horizontal"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:weightSum="4">

    <TextView
        android:id="@+id/tv_adet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:fontFamily="@font/montserrat"
        android:paddingRight="10dp"
        android:layout_marginStart="7dp"
        android:layout_marginTop="5dp"
        android:text="@string/adet"
        android:layout_weight="1"
        android:textColor="@color/black"
        android:textSize="25dp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.05"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/piece"
            style="@style/adetTxtLayout"
            android:layout_width="83dp"
            android:layout_height="50dp"
            android:layout_marginTop="10dp"
            android:layout_weight="1"
            android:hint="@string/adetTxt"
            app:layout_constraintStart_toEndOf="@+id/adet"
            app:layout_constraintTop_toTopOf="parent">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/etNumber"
                style="@style/adetTxt"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
            </com.google.android.material.textfield.TextInputEditText>
        </com.google.android.material.textfield.TextInputLayout>

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btncalculate"
            style="@style/ButtonGrey"
            android:layout_width="90dp"
            android:layout_height="50dp"
            android:layout_marginStart="7dp"
            android:layout_marginTop="1dp"
            android:layout_marginEnd="7dp"
            android:layout_weight="1"
            android:text="@string/hesapla"
            app:layout_constraintEnd_toStartOf="@+id/btn_login2"
            app:layout_constraintStart_toEndOf="@+id/piece"
            app:layout_constraintTop_toTopOf="parent" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btn_login2"
            style="@style/ButtonGrey"
            android:layout_weight="1"
            android:layout_width="90dp"
            android:layout_height="50dp"
            android:layout_marginTop="1dp"
            android:layout_marginEnd="7dp"
            android:text="@string/bul"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </LinearLayout>

MainActivity代码

class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btnCalculate.setOnClickListener {
            val num = binding.inpiece.text.toString().toIntOrNull() ?: return@setOnClickListener
            if (num < 1 || num > 10) return@setOnClickListener

            val textView = TextView(this)
            textView.text = "Hello, World!"
            binding.gridLyt.addView(textView)

            binding.gridLyt.apply {
                rowCount = num
                columnCount = num
                removeAllViews()

                for (i in 0 until num) {
                    for (j in 0 until num) {
                        val value = (1..10).random()
                        val textView = TextView(context).apply {
                            text = value.toString()
                            textSize = 24f
                            textAlignment = View.TEXT_ALIGNMENT_CENTER
                        }
                        addView(textView, GridLayout.LayoutParams().apply {
                            rowSpec = GridLayout.spec(i, 1f)
                            columnSpec = GridLayout.spec(j, 1f)
                            width = 0
                            height = GridLayout.LayoutParams.WRAP_CONTENT
                        })
                    }
                }
            }
        }
    }
}

问题排查与修复

1. ViewBinding ID匹配错误

  • XML中输入框ID是etNumber,但代码里用了binding.inpiece,导致获取不到输入值直接退出点击事件,需改成binding.etNumber。
  • XML中按钮ID是btncalculate(全小写),代码里用了binding.btnCalculate(驼峰),导致点击事件未绑定,需改成binding.btncalculate.setOnClickListener。

2. 冗余代码干扰

代码中先添加了一个"Hello, World!"的TextView,随后立刻调用removeAllViews(),这步完全多余,直接删除即可。

3. GridLayout显示优化

当前GridLayout高度为wrap_content,若生成的TextView高度太小可能视觉上无变化,可将高度改为0dp并添加app:layout_constraintHeight_default="wrap",或给单元格TextView添加内边距、背景色,方便区分。


修复后的MainActivity代码

class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btncalculate.setOnClickListener {
            val num = binding.etNumber.text.toString().toIntOrNull() ?: return@setOnClickListener
            if (num < 1 || num > 10) return@setOnClickListener

            binding.gridLyt.apply {
                rowCount = num
                columnCount = num
                removeAllViews()

                for (i in 0 until num) {
                    for (j in 0 until num) {
                        val value = (1..10).random()
                        val textView = TextView(context).apply {
                            text = value.toString()
                            textSize = 24f
                            textAlignment = View.TEXT_ALIGNMENT_CENTER
                            setPadding(16,16,16,16)
                        }
                        addView(textView, GridLayout.LayoutParams().apply {
                            rowSpec = GridLayout.spec(i, 1f)
                            columnSpec = GridLayout.spec(j, 1f)
                            width = 0
                            height = GridLayout.LayoutParams.WRAP_CONTENT
                            setBackgroundColor(ContextCompat.getColor(context, R.color.grey_light))
                            margin = 4
                        })
                    }
                }
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:10:43