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

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

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

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

Android Studio

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

Kotlin

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

解決済

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

hiro04kon
hiro04kon

総合スコア27

button

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

Android Studio

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

Kotlin

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

1回答

0評価

0クリップ

112閲覧

投稿2022/05/19 03:41

作っているものの概要

開発環境 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) } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

hoshi-takanori

2022/05/19 07:22

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

2022/05/19 12:43

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

button

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

Android Studio

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

Kotlin

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