質問編集履歴

3

問題点を要約

2019/09/18 01:33

投稿

adk
adk

スコア12

test CHANGED
@@ -1 +1 @@
1
- スピナーの容変更に応じてDB横幅を調節する方法の質問
1
+ TableRowセルWidth取得方法について
test CHANGED
@@ -1,163 +1,39 @@
1
+ 現状、Android StudioのKotlinでTableLayout内にTableRow、さらにそのTableRowの中に複数のTextViewを入れ、
2
+
1
- いつもお世話っています。
3
+ エクセルのシートのようしたDBを作っています。
2
4
 
3
5
 
4
6
 
5
- 現状Android StudioのKotlinでスピナーの下ヘッダー及びボディからなるDB置かれてアプリ作って
7
+ この時各TextView内文字入力さたら、それに応じ変動す各TextViewのWidth取得したので
6
8
 
7
- ヘッダーは固定、ボディはスクロール可能な仕様です。
9
+ 下記コドではすべて0という値が返ってきてうまくいきません
8
-
9
- 絞り込み欄内で条件を選択すると、絞り込まれた項目がボディに表示される仕組みになっています。
10
-
11
- (下図参照)
12
-
13
- ┌─────────────────────────────────────┐
14
-
15
- │        ┌──────────────────┐           │
16
-
17
- │ 絞り込み欄 │   Spinner    │           │
18
-
19
- │       └──────────────────┘            │
20
-
21
- │                                   │
22
-
23
- │          ヘッダー(TableLayout)             │
24
-
25
- │  ┌─────────────────────────────┐  │
26
-
27
- │  │   項目1    │ 項目2 │ 項目3 │  │
28
-
29
- │  └──────────────────┘──────────┘  │
30
-
31
- │        ボディ(ScrollView内のTableLayout)   │
32
-
33
- │  ┌─────────────────────────────┐ │
34
-
35
- │  │ 1行目.項目1  │ 1行目.項目2 │ 1行目.項目3 │ │
36
-
37
- │  └──────────────────┘──────────┘ │
38
-
39
- │   │ 2行目.項目1  │ 2行目.項目2 │ 2行目.項目3 │ │
40
-
41
- │  └──────────────────┘──────────┘ │
42
-
43
- └─────────────────────────────────────┘
44
10
 
45
11
 
46
12
 
13
+ val Body = findViewById(R.id.tl_Body) as TableLayout
47
14
 
15
+ if (Body.childCount > 0) {
48
16
 
49
- 時、「絞り込み欄」の内容変えごとにボディとヘッダーの横幅が適切に調節されるようにしたいと考えています。
17
+ val Bodyrow = Body.getChildAt(0) as TableRow//0行目(最初// )
50
18
 
51
- (例えば、ヘッダーの項目1の内容の横幅のほうがボディの1、2行目の項目1の内容の横幅より大きい場合は、
19
+ for (cellnum in 0 until Bodyrow.childCount) {
52
20
 
53
- 項目1の列の横幅(ヘッダーの横幅及びボディの横幅)はヘッダーに合わす。
21
+ val cell = Bodyrow.getChildAt(cellnum) as TextView
54
22
 
55
- 逆にボディ項目の横幅の洋画大きい場合はボディの横幅に合わす)
23
+ val params = cell.layoutParams as TableRow.LayoutParams  //セルパラメータを得る
24
+
25
+ val text = cell.text //セルの中身に値が入っているかをデバッグ時に確認するための行。中身は入っている。
26
+
27
+ val cellWidth = if (params.span == 1) cell.width else 0  //params.spanは1なのでcell.widthの値が返ってくる。だがその中身が0
28
+
29
+ }
30
+
31
+ }
56
32
 
57
33
 
58
34
 
59
- 仕様実現するため、
35
+ cell.width部分が悪いと思われるのですが、代わりにどのような関数でwidth取得れば正しい値が取れのかがわかりません。
60
36
 
61
37
 
62
38
 
63
- https://time-complexity.blogspot.com/2014/10/tablelayout-scroll-head-body-auto-width.html
64
-
65
-
66
-
67
- のやり方を参考に「ListViewTable」をいうLinearLayoutを継承したカスタムクラスを作り、それで
68
-
69
- ヘッダーとボディを挟み込んだうえでListViewTableのonLayout時にヘッダー、ボディ横幅を調節するというプログラムを行ったのですが
70
-
71
- うまくいきません。(「絞り込み欄」を変えてもヘッダー、ボディの横幅が合わない。)
72
-
73
-
74
-
75
- 「絞り込み欄」のSpinnerのListnerを無効化するとonLayout内のプログラムが通り、横幅が合います。
76
-
77
- (SpinnerのListnerの中ではボディへの値入力のみを行っています)
78
-
79
-
80
-
81
- この現象の原因がわからないため、これが原因ではというアドバイスを頂けませんでしょうか。
82
-
83
-
84
-
85
- お手数ですがよろしくお願いいたします。
39
+ お手数ですがご教授をお願いいたします。
86
-
87
-
88
-
89
-
90
-
91
- 追記=================================================================
92
-
93
-
94
-
95
- 現状、onLayoutに記述した横幅調整のOnItemSelectedの際、何らかの原因で無効になるのが原因ではと思い至りました。
96
-
97
-
98
-
99
-
100
-
101
- 現状のプログラムでは、ボディへの値の代入はOnResumeと横幅調整のOnItemSelectedの際に行っています。この条件を変更した際、
102
-
103
-
104
-
105
- OnResume:有効  OnItemSelected:有効⇒横幅調節「無効」
106
-
107
- OnResume:有効  OnItemSelected:無効⇒横幅調節「有効」
108
-
109
- OnResume:無効  OnItemSelected:有効⇒横幅調節「無効」
110
-
111
-
112
-
113
- となりました。明らかに原因はOnItemSelectedと思われます。
114
-
115
-
116
-
117
-
118
-
119
- ですが、OnItemSelected回りでブレークポイントを入れると、
120
-
121
- OnItemSelectedで値入力⇒onLayoutの順番でコードが動いており、onLayoutの関数の中身
122
-
123
- に代入される横幅の値は正しいように思えます。
124
-
125
- (OnLayout内のボディの横幅はちゃんと「ボディに値を入力した後の」横幅が入力されていました。ですが
126
-
127
- 最終的には誤った横幅で出力されます。・・・何故?)
128
-
129
- これを踏まえて、下記の1、2の質問をしたいです。
130
-
131
-
132
-
133
- 1.現状、下記のコードでTableLayout内のTableRow内のcellに横幅を代入しています。このコードの書き方は間違っているのでしょうか。
134
-
135
-
136
-
137
-
138
-
139
- val Body = findViewById(R.id.tl_Body) as TableLayout//ボディのテーブルレイアウト。
140
-
141
- val colWidths = LinkedList<Int>()//この中に最終的に入れたい横幅の値の一覧が入っている。中身の値は正しい。
142
-
143
-                   
144
-
145
-             for (rownum in 0 until Body.childCount) {
146
-
147
- val row = Body.getChildAt(rownum) as TableRow
148
-
149
- for (cellnum in 0 until row.childCount) {
150
-
151
- val cell = row.getChildAt(cellnum)
152
-
153
- val params = cell.layoutParams as TableRow.LayoutParams
154
-
155
- params.width = colWidths[cellnum]
156
-
157
- }
158
-
159
-
160
-
161
- 2.OnLayoutのほかにレイアウトが変更される際に発動するプロパティをご存じでしょうか。その中に横幅調節の関数を入れて試してみます。
162
-
163
- なお、OnMeasureは試してみましたがうまくいきませんでした。

2

追記を追加

2019/09/18 01:33

投稿

adk
adk

スコア12

test CHANGED
File without changes
test CHANGED
@@ -83,3 +83,81 @@
83
83
 
84
84
 
85
85
  お手数ですがよろしくお願いいたします。
86
+
87
+
88
+
89
+
90
+
91
+ 追記=================================================================
92
+
93
+
94
+
95
+ 現状、onLayoutに記述した横幅調整のOnItemSelectedの際、何らかの原因で無効になるのが原因ではと思い至りました。
96
+
97
+
98
+
99
+
100
+
101
+ 現状のプログラムでは、ボディへの値の代入はOnResumeと横幅調整のOnItemSelectedの際に行っています。この条件を変更した際、
102
+
103
+
104
+
105
+ OnResume:有効  OnItemSelected:有効⇒横幅調節「無効」
106
+
107
+ OnResume:有効  OnItemSelected:無効⇒横幅調節「有効」
108
+
109
+ OnResume:無効  OnItemSelected:有効⇒横幅調節「無効」
110
+
111
+
112
+
113
+ となりました。明らかに原因はOnItemSelectedと思われます。
114
+
115
+
116
+
117
+
118
+
119
+ ですが、OnItemSelected回りでブレークポイントを入れると、
120
+
121
+ OnItemSelectedで値入力⇒onLayoutの順番でコードが動いており、onLayoutの関数の中身
122
+
123
+ に代入される横幅の値は正しいように思えます。
124
+
125
+ (OnLayout内のボディの横幅はちゃんと「ボディに値を入力した後の」横幅が入力されていました。ですが
126
+
127
+ 最終的には誤った横幅で出力されます。・・・何故?)
128
+
129
+ これを踏まえて、下記の1、2の質問をしたいです。
130
+
131
+
132
+
133
+ 1.現状、下記のコードでTableLayout内のTableRow内のcellに横幅を代入しています。このコードの書き方は間違っているのでしょうか。
134
+
135
+
136
+
137
+
138
+
139
+ val Body = findViewById(R.id.tl_Body) as TableLayout//ボディのテーブルレイアウト。
140
+
141
+ val colWidths = LinkedList<Int>()//この中に最終的に入れたい横幅の値の一覧が入っている。中身の値は正しい。
142
+
143
+                   
144
+
145
+             for (rownum in 0 until Body.childCount) {
146
+
147
+ val row = Body.getChildAt(rownum) as TableRow
148
+
149
+ for (cellnum in 0 until row.childCount) {
150
+
151
+ val cell = row.getChildAt(cellnum)
152
+
153
+ val params = cell.layoutParams as TableRow.LayoutParams
154
+
155
+ params.width = colWidths[cellnum]
156
+
157
+ }
158
+
159
+
160
+
161
+ 2.OnLayoutのほかにレイアウトが変更される際に発動するプロパティをご存じでしょうか。その中に横幅調節の関数を入れて試してみます。
162
+
163
+ なお、OnMeasureは試してみましたがうまくいきませんでした。

1

文字の打ち間違いの訂正

2019/09/17 08:08

投稿

adk
adk

スコア12

test CHANGED
File without changes
test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  │  └──────────────────┘──────────┘  │
30
30
 
31
- │        ボディ(ScrollVieww内のTableLayout)   │
31
+ │        ボディ(ScrollView内のTableLayout)   │
32
32
 
33
33
  │  ┌─────────────────────────────┐ │
34
34
 
@@ -74,7 +74,7 @@
74
74
 
75
75
  「絞り込み欄」のSpinnerのListnerを無効化するとonLayout内のプログラムが通り、横幅が合います。
76
76
 
77
- (SpinnerのLayoutの中ではボディへの値入力のみを行っています)
77
+ (SpinnerのListnerの中ではボディへの値入力のみを行っています)
78
78
 
79
79
 
80
80