質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
button

HTMLで用いる<button>タグです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

954閲覧

Kotlin動的レイアウトでのボタン動作がおかしい

hiro04kon

総合スコア46

button

HTMLで用いる<button>タグです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

1グッド

0クリップ

投稿2022/05/19 03:41

作っているものの概要

開発環境 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
hoshi-takanori👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/05/19 07:22

drawable がすべてのボタンで共有されてるのが問題っぽいですね。ループの中で毎回生成するようにしたら期待通りの動きになるかと。
hiro04kon

2022/05/19 12:43

ありがとうございます! 「val drawable = GradientDrawable()」 以下の設定をfor文の中に入れたら、期待通りの動きになりました! 共通の設定なのでfor文の外に書いておこう、と思ったのですが…、勉強になりました! ありがとうございます!
guest

回答1

0

自己解決

kotlin

1 val drawable = GradientDrawable() 2 //角丸 3 drawable.cornerRadius = 50f 4 //輪郭 5 drawable.setStroke(6, Color.parseColor("white")) 6 //ボタン押下時・通常時の色指定 7 drawable.color = ColorStateList( 8 arrayOf(intArrayOf(R.attr.state_pressed), intArrayOf()), 9 intArrayOf(Color.parseColor("#88ddff"), Color.parseColor("#99ffff")) 10 )

をfor文の中の btn.background = drawable の前に挿入したらできました。

投稿2022/05/19 12:45

編集2022/05/19 12:47
hiro04kon

総合スコア46

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問