作っているものの概要
開発環境 Androidstudio2021.2.1
Gradle 7.1.3
API 31以上
kotlinでGridlayoutを使い、動的にボタンを作るアプリを開発中です。
ボタンを押したときに色が変わり、一度押すとグレーアウトし押せなくなるようにしています。
改善したい症状
ほぼ期待通りの動作はしますが、どのボタンを押しても最後に作成されたボタンが押したときの色になったままになってしまいます。
素人考えですが、ボタンを示すbtnが、最後に作ったものを指し示すままになっているためと思うのですが…。
改善方法を教えてください。よろしくお願いします。
以下がcodeです。
kotlin
1package com.example.gridlayout 2 3import android.R 4import android.content.res.ColorStateList 5import android.graphics.Color 6import android.graphics.drawable.GradientDrawable 7import androidx.appcompat.app.AppCompatActivity 8import android.os.Bundle 9import android.view.Gravity 10import android.view.View 11import android.widget.* 12import java.util.* 13import kotlin.math.log 14import android.util.Log 15 16class MainActivity : AppCompatActivity() { 17 private var textView: TextView? = null 18 override fun onCreate(savedInstanceState: Bundle?) { 19 super.onCreate(savedInstanceState) 20 //setContentView(R.layout.activity_main) 21 22 // リニアレイアウトの設定 23 val layout = LinearLayout(this) 24 layout.orientation = LinearLayout.VERTICAL 25 layout.layoutParams = LinearLayout.LayoutParams( 26 LinearLayout.LayoutParams.MATCH_PARENT, 27 LinearLayout.LayoutParams.MATCH_PARENT 28 ) 29 30 // レイアウト中央寄せ 31 layout.gravity = Gravity.CENTER 32 setContentView(layout) 33 34 // TextViewの設定 35 textView = TextView(this) 36 val str = "TextView" 37 textView!!.text = str 38 textView!!.setTextColor(-0x1000000) 39 textView!!.textSize = 20F 40 layout.addView( 41 textView, 42 LinearLayout.LayoutParams( 43 LinearLayout.LayoutParams.WRAP_CONTENT, 44 LinearLayout.LayoutParams.WRAP_CONTENT 45 ) 46 ) 47 48 val mainGridLayout = GridLayout(this) 49 val colCount = 6 //横 50 val rowCount = 5 //縦 51 52 val dp = windowManager.defaultDisplay 53 54 // ボタンの色設定 55 var btn: Button 56 var b_num = 0 57 val drawable = GradientDrawable() 58 //角丸 59 drawable.cornerRadius = 50f 60 //輪郭 61 drawable.setStroke(6, Color.parseColor("white")) 62 //ボタン押下時・通常時の色指定 63 drawable.color = ColorStateList( 64 arrayOf(intArrayOf(R.attr.state_pressed), intArrayOf()), 65 intArrayOf(Color.parseColor("#88ddff"), Color.parseColor("#99ffff")) 66 ) 67 68 mainGridLayout.setBackgroundColor(Color.rgb(0xdd, 0xff, 0xee)) 69 70 // ボタンを動的に作成 71 for (i in 0..(rowCount - 1)) { 72 for (j in 0..(colCount - 1)) { 73 // buttonの生成 74 btn = Button(this) 75 b_num += 1 76 btn.id = b_num 77 btn.text = String.format(Locale.US, "Button %d:%d\u000aid:$b_num", i + 1, j + 1) 78 79 // GridLayout用のパラメータを設定 80 val params = GridLayout.LayoutParams() 81 params.width = dp.width / colCount 82 params.height = dp.height / (rowCount + 1) 83 params.rowSpec = GridLayout.spec(i) 84 params.columnSpec = GridLayout.spec(j) 85 btn.layoutParams = params 86 btn.background = drawable 87 88 mainGridLayout.addView(btn) 89 90 // Listnerをセット 91 btn.setOnClickListener { v: View -> 92 // View からidを取り出す 93 textView!!.text = String.format( 94 Locale.US, 95 "Button: %s", v.id.toString() 96 ) 97 Toast.makeText(this, """Button: ${v.id}クリックされました。""", Toast.LENGTH_SHORT).show() 98 //クリック不可にする 99 v.isEnabled = false 100 //グレイにする 101 v.setBackgroundColor(Color.parseColor("gray")) 102 } 103 } 104 } 105 // Gridlayoutを追加 106 layout.addView(mainGridLayout) 107 } 108} 109
回答1件
あなたの回答
tips
プレビュー