作っているものの概要
開発環境 Androidstudio2021.2.1
Gradle 7.1.3
API 31以上
kotlinでGridlayoutを使い、動的にボタンを作るアプリを開発中です。
ボタンを押したときに色が変わり、一度押すとグレーアウトし押せなくなるようにしています。
改善したい症状
ほぼ期待通りの動作はしますが、どのボタンを押しても最後に作成されたボタンが押したときの色になったままになってしまいます。
素人考えですが、ボタンを示すbtnが、最後に作ったものを指し示すままになっているためと思うのですが…。
改善方法を教えてください。よろしくお願いします。
以下がcodeです。
kotlin
package com.example.gridlayout import android.R import android.content.res.ColorStateList import android.graphics.Color import android.graphics.drawable.GradientDrawable import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.Gravity import android.view.View import android.widget.* import java.util.* import kotlin.math.log import android.util.Log class MainActivity : AppCompatActivity() { private var textView: TextView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //setContentView(R.layout.activity_main) // リニアレイアウトの設定 val layout = LinearLayout(this) layout.orientation = LinearLayout.VERTICAL layout.layoutParams = LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT ) // レイアウト中央寄せ layout.gravity = Gravity.CENTER setContentView(layout) // TextViewの設定 textView = TextView(this) val str = "TextView" textView!!.text = str textView!!.setTextColor(-0x1000000) textView!!.textSize = 20F layout.addView( textView, LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ) ) val mainGridLayout = GridLayout(this) val colCount = 6 //横 val rowCount = 5 //縦 val dp = windowManager.defaultDisplay // ボタンの色設定 var btn: Button var b_num = 0 val drawable = GradientDrawable() //角丸 drawable.cornerRadius = 50f //輪郭 drawable.setStroke(6, Color.parseColor("white")) //ボタン押下時・通常時の色指定 drawable.color = ColorStateList( arrayOf(intArrayOf(R.attr.state_pressed), intArrayOf()), intArrayOf(Color.parseColor("#88ddff"), Color.parseColor("#99ffff")) ) mainGridLayout.setBackgroundColor(Color.rgb(0xdd, 0xff, 0xee)) // ボタンを動的に作成 for (i in 0..(rowCount - 1)) { for (j in 0..(colCount - 1)) { // buttonの生成 btn = Button(this) b_num += 1 btn.id = b_num btn.text = String.format(Locale.US, "Button %d:%d\u000aid:$b_num", i + 1, j + 1) // GridLayout用のパラメータを設定 val params = GridLayout.LayoutParams() params.width = dp.width / colCount params.height = dp.height / (rowCount + 1) params.rowSpec = GridLayout.spec(i) params.columnSpec = GridLayout.spec(j) btn.layoutParams = params btn.background = drawable mainGridLayout.addView(btn) // Listnerをセット btn.setOnClickListener { v: View -> // View からidを取り出す textView!!.text = String.format( Locale.US, "Button: %s", v.id.toString() ) Toast.makeText(this, """Button: ${v.id}クリックされました。""", Toast.LENGTH_SHORT).show() //クリック不可にする v.isEnabled = false //グレイにする v.setBackgroundColor(Color.parseColor("gray")) } } } // Gridlayoutを追加 layout.addView(mainGridLayout) } }
まだ回答がついていません
会員登録して回答してみよう