前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー