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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

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

Q&A

解決済

1回答

871閲覧

動的に表示したボタンのイベント実装

shosinsya1

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

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

0グッド

0クリップ

投稿2021/06/15 07:05

編集2021/06/15 11:42

前提・実現したいこと

inflateを使用して動的に表示した表形式のデータに対して、該当行に割り当てたボタンを押下した際のイベントを実装したい(コード上の”ここまで行けましたか?”というprintに飛ばしたい)のですが、
human_rowの形で追加したボタンを押下してもイベントを発生させることができません。
動的に表示した表形式のデータに対してイベントを発生させるにはどのようにコードを変更する必要があるでしょうか。勉強を始めたばかりで的を射ない質問となっておりますことご容赦ください。

発生している問題・エラーメッセージ

androidでアプリを勉強がてら作成している初心者です。言語:kotlin inflateを使用して動的に表示した表形式のデータに対して、該当行に割り当てたボタンを押下した際のイベントを実装したい(コード上の”ここまで行けましたか?”というprintに飛ばしたい)のですが、 human_rowの形で追加したボタンを押下してもイベントを発生させることができません。

該当のソースコード

kotlin

1package com.example.ktstudy 2 3import android.os.AsyncTask 4import androidx.appcompat.app.AppCompatActivity 5import android.os.Bundle 6import android.os.Handler 7import android.os.Looper 8import android.content.Intent 9import android.view.LayoutInflater 10import android.view.View 11import android.widget.TableLayout 12import android.widget.TableRow 13import androidx.core.view.children 14import androidx.room.Room 15import kotlinx.android.synthetic.main.activity_main.* 16import kotlinx.android.synthetic.main.activity_main.view.* 17import kotlinx.android.synthetic.main.human_row.view.* 18import android.util.Log 19import android.view.ViewGroup 20import android.widget.Button 21import android.widget.TextView 22import kotlinx.android.synthetic.main.human_row.* 23 24class MainActivity : AppCompatActivity() { 25 private lateinit var db: UserDataBase 26 private lateinit var dao: UserDao 27 private val mainHandler = Handler(Looper.getMainLooper()) 28 override fun onCreate(savedInstanceState: Bundle?) { 29 super.onCreate(savedInstanceState) 30 setContentView(R.layout.activity_main) 31 32 //database という名前のデータベースを使用 33 db = Room.databaseBuilder( 34 applicationContext, 35 UserDataBase::class.java,"database" 36 ).build() 37 dao = db.userDao() 38 setAllHumanToTable() 39 40 41 addButton.setOnClickListener(ButtonListener()) 42 removeButton.setOnClickListener(ButtonListener()) 43 searchButton.setOnClickListener(ButtonListener()) 44 chooseButton.setOnClickListener(ButtonListener()) 45 } 46 47 48 //データベース内にあるデータを全て表示します 49 private fun setAllHumanToTable(){ 50 //データベース関連の動作は重いため、メインスレッドで動かしてはいけない決まりがあります 51 AsyncTask.execute{ 52 val humanList = dao.getHumanAll() 53 for(human in humanList){ 54 //全てのhumanをrowに追加 55 val row = View.inflate(this@MainActivity,R.layout.human_row,null) 56 row.buttonId.tag = human.id.toString() 57 row.nameTextView.text = human.name 58 row.ageTextView.text = human.age.toString() 59 60 //逆に、メインスレッド以外でUIの操作は出来ません 61 //なので、このようにしてメインスレッドにViewの追加をお願いしています 62 mainHandler.post{ 63 humanTable.addView(row) 64 } 65 } 66 } 67 } 68 private fun resetTable(){ 69 //humanTableの子を全て参照して 70 //先頭以外のrowを全て削除しています 71 humanTable.children.forEach { 72 if(it is TableRow && it.id != R.id.headRow){ 73 mainHandler.post{ 74 humanTable.removeView(it) 75 } 76 } 77 } 78 setAllHumanToTable() 79 } 80 private fun addHumanFunction(){ 81 AsyncTask.execute{ 82 val name = addNameInput.text.toString() 83 val age = addAgeInput.text.toString().toIntOrNull() ?: -1 84 if(name != "" && age >= 0){ 85 dao.insertHuman(HumanEntity(id = 0,name = name,age = age)) 86 } 87 } 88 } 89 private fun removeHumanFunction(){ 90 AsyncTask.execute{ 91 val name = removeNameInput.text.toString() 92 val humanList = dao.searchName(name) 93 for(human in humanList){ 94 dao.deleteAllHuman(human) 95 } 96 } 97 } 98 private fun searchHumanFunction(){ 99 AsyncTask.execute{ 100 val name = searchNameInput.text.toString() 101 val humanList = dao.searchName(name) 102 //for文を回す前にビューをリセットし、for文から行データを取り出して表示させる 103 mainHandler.post{__イタリックテキスト__ 104 humanTable.removeAllViews() 105 } 106 val vg = findViewById<View>(R.id.humanTable) as ViewGroup 107 for(human in humanList){ 108 109 //全てのhumanをrowに追加 110 val row = View.inflate(this@MainActivity,R.layout.human_row,null) 111 row.buttonId.tag = human.id.toString() 112 row.nameTextView.text = human.name 113 row.ageTextView.text = human.age.toString() 114 115 //逆に、メインスレッド以外でUIの操作は出来ません 116 //なので、このようにしてメインスレッドにViewの追加をお願いしています 117 mainHandler.post{ 118 humanTable.addView(row) 119 } 120 } 121 } 122 } 123 124 private fun childViewChose(){ 125 println("ここまでこれましたか?") 126 } 127 128 inner class ButtonListener: View.OnClickListener{ 129 override fun onClick(v: View) { 130 val buttonId = findViewById<View>(R.id.buttonId) 131 childViewChose() 132 AsyncTask.execute { 133 when (v.id) { 134 R.id.addButton -> addHumanFunction() 135 R.id.removeButton -> removeHumanFunction() 136 } 137 resetTable() 138 when (v.id) { 139 R.id.searchButton -> searchHumanFunction() 140 } 141 } 142 } 143 } 144} 145

試したこと

androidでアプリを勉強がてら作成している初心者です。言語:kotlin
inflateを使用して動的に表示した表形式のデータに対して、該当行に割り当てたボタンを押下した際のイベントを実装したい(コード上の”ここまで行けましたか?”というprintに飛ばしたい)のですが、human_rowの形で追加したボタンを押下してもイベントを発生させることができません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

hoshi-takanori

2021/06/15 09:09

ButtonListener の onClick メソッドで buttonId.setOnClickListener する必要はないのでは。
shosinsya1

2021/06/15 11:44 編集

コメントありがとうございます。初心者で質問や訂正の意図もはき違えている可能性があり大変恐縮なのですが、ButtonListener の onClick メソッドで buttonId.setOnClickListener を削除し、直下に呼び出したいメソッドを書いたのですが、やはりnflateを使用して動的に表示したボタンのbuttonId押下時に childViewChose()が動作しない状況です。
hoshi-takanori

2021/06/15 13:20

setAllHumanToTable で row.buttonId.setOnClickListener(ButtonListener()) とか。 (でも、TableLayout よりも ListView や RecyclerView の方が良い気が…。)
shosinsya1

2021/06/15 13:53

row.buttonId.setOnClickListener(ButtonListener())でやりたいことはできました、ありがとうございました!拙い質問ながら丁寧にご回答いただきありがとうございます! listViewやRecycleViewについても調べてみます、ありがとうございました!
guest

回答1

0

自己解決

row.buttonId.setOnClickListener(ButtonListener())でやりたいことはできました、ありがとうございました!

投稿2021/06/15 13:53

shosinsya1

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問