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

