teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

ソース全容追加

2018/01/09 04:59

投稿

enigumalu
enigumalu

スコア192

title CHANGED
File without changes
body CHANGED
@@ -1,13 +1,131 @@
1
1
  androidで複数項目を動的に生成した際にxmlで指定しているR.id.buttonが同じ名前で複数できてしまい、ここにプログラム側でsetOnClickListenerを設定できなく困っています
2
2
  xmlを利用して複数個生成したタイミングでbuttonアイテムにClickListenerを設定する事はできるのでしょうか?
3
3
  forで指定された個数分生成しているので子viewなどでidを使い回す時の所作が全く想像できていません
4
+ MainActivity.kt
4
5
  ```
6
+ import android.support.v7.app.AppCompatActivity
7
+ import android.os.Bundle
8
+ import android.view.View
9
+ import android.widget.*
10
+ import temple.count.ms.app.MainActivity.SeedTypeDialogFragment
11
+
12
+ class MainActivity : AppCompatActivity() {
13
+ protected var spinnerButton: Button? = null
14
+ protected var count = 0
15
+ private lateinit var seedTypeDialogFragment: SeedTypeDialogFragment
16
+ override fun onCreate(savedInstanceState: Bundle?) {
17
+ super.onCreate(savedInstanceState)
18
+ setContentView(R.layout.activity_main)
19
+
20
+
21
+ // Spinnerオブジェクトの取得
22
+ var totalNum: Spinner = this!!.findViewById(R.id.total_num) as Spinner
23
+ val totalNumKAry = arrayOf("1", "2", "3", "4", "5", "6", "7", "8")
24
+ setSpinner(totalNum, totalNumKAry)
25
+ }
26
+
27
+ /**
28
+ * setSpinner Spinner項目設定
29
+ * @param spinnerObj xmlスピナー項目.
30
+ * @param spinnerAry スピナーに設定する値.
31
+ */
32
+ fun setSpinner(spinnerObj: Spinner, spinnerAry: Array<kotlin.String>) {
33
+ // アダプタの作成(文字列だけのArrayAdapter)
34
+ var spinnerAdapter = ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, spinnerAry)
35
+ // Spinnerにアダプタをセット
36
+ spinnerObj.adapter = spinnerAdapter
37
+ spinnerObj.onItemSelectedListener = TotalSpinnerSelectedListener()
38
+ }
39
+
40
+ inner class TotalSpinnerSelectedListener : AdapterView.OnItemSelectedListener {
41
+ override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
42
+ // Spinner を取得
43
+ val spinner = parent as Spinner
44
+ val layout = findViewById<View>(R.id.layout_org) as LinearLayout
45
+ layout.removeAllViews()
46
+ // 選択されたアイテムのテキストを取得
47
+ val spinnerStr = spinner.selectedItem.toString()
5
48
  for (i in 1..spinnerStr.toInt()) {
6
49
  val view = layoutInflater.inflate(R.layout.sub, null)
7
- // Spinner風のボタン
50
+ //Spinnerボタン
51
+ //TODO ここがただしくない
8
- spinnerButton = view.findViewById<View>(R.id.button) as Button
52
+ spinnerButton = view.findViewById<View>(R.id.button0) as Button
9
- spinnerButton!!.setText("選択")
53
+ spinnerButton!!.setText("選択してください"+i.toString())
54
+ spinnerButton!!.setTag(i)
55
+ count = i
10
56
  spinnerButton!!.setOnClickListener(onSpinnerClickListener)
11
57
  layout.addView(view)
12
58
  }
59
+ }
60
+ // 何も選択されなかった時の動作
61
+ override fun onNothingSelected(parent: AdapterView<*>) {}
62
+ }
63
+
64
+ //
65
+ private val onSpinnerClickListener = object : View.OnClickListener {
66
+ override fun onClick(v: View) {
67
+ v.setTag(count)
68
+ seedTypeDialogFragment = SeedTypeDialogFragment()
69
+ seedTypeDialogFragment.show(supportFragmentManager, "tag")
70
+ }
71
+ }
72
+ }
73
+ ```
74
+ SeedTypeDialogFragment.kt
75
+ ```
76
+ import android.os.Bundle
77
+ import android.annotation.SuppressLint
78
+ import android.app.Dialog
79
+ import android.support.v4.app.DialogFragment
80
+ import android.view.View
81
+ import android.view.LayoutInflater
82
+ import android.view.animation.AnimationUtils
83
+ import android.widget.*
84
+ import android.widget.LinearLayout
85
+ import com.example.test.myapplication3.R
86
+
87
+
88
+ @SuppressLint("ValidFragment")
89
+ class SeedTypeDialogFragment : DialogFragment() {
90
+ protected var spinnerButton: Button? = null
91
+
92
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
93
+ val dialog = Dialog(activity)
94
+ val inflater = LayoutInflater.from(activity)
95
+ val view = inflater.inflate(R.layout.seedtype_selected_item, null,false)
96
+
97
+ val layout = view.findViewById(R.id.layout) as LinearLayout
98
+ val iCount = layout.getChildCount()
99
+
100
+ var i = 0
101
+ while (i < iCount) {
102
+ val v: View
103
+ v = layout.getChildAt(i)
104
+ v!!.setOnClickListener(textButtonClick)
105
+ i++
106
+ }
107
+ dialog.setContentView(view)
108
+ return dialog
109
+ }
110
+ override fun onPause() {
111
+ super.onPause()
112
+ // onPause でダイアログを閉じる場合
113
+ dismiss()
114
+ }
115
+ // アクティビティ
116
+ private val textButtonClick = object : View.OnClickListener {
117
+ override fun onClick(view: View) {
118
+ view!!.startAnimation(AnimationUtils.loadAnimation(activity, R.anim.button))
119
+ val bt = view as TextView
120
+ val buttonText = bt.text.toString()
121
+ val parentView = view.getParent() as View
122
+ //TODO 動的生成の影響を受けている
123
+ spinnerButton = activity.findViewById<View>(R.id.button0) as Button
124
+ spinnerButton!!.setText(buttonText)
125
+ Toast.makeText(activity, buttonText, Toast.LENGTH_SHORT).show()
126
+ dismiss()
127
+ }
128
+ }
129
+
130
+ }
13
131
  ```

1

追記

2018/01/09 04:59

投稿

enigumalu
enigumalu

スコア192

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,6 @@
1
1
  androidで複数項目を動的に生成した際にxmlで指定しているR.id.buttonが同じ名前で複数できてしまい、ここにプログラム側でsetOnClickListenerを設定できなく困っています
2
2
  xmlを利用して複数個生成したタイミングでbuttonアイテムにClickListenerを設定する事はできるのでしょうか?
3
+ forで指定された個数分生成しているので子viewなどでidを使い回す時の所作が全く想像できていません
3
4
  ```
4
5
  for (i in 1..spinnerStr.toInt()) {
5
6
  val view = layoutInflater.inflate(R.layout.sub, null)