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

質問編集履歴

3

問題点を要約

2019/09/18 01:33

投稿

adk
adk

スコア12

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

2

追記を追加

2019/09/18 01:33

投稿

adk
adk

スコア12

title CHANGED
File without changes
body CHANGED
@@ -40,4 +40,43 @@
40
40
 
41
41
  この現象の原因がわからないため、これが原因ではというアドバイスを頂けませんでしょうか。
42
42
 
43
- お手数ですがよろしくお願いいたします。
43
+ お手数ですがよろしくお願いいたします。
44
+
45
+
46
+ 追記=================================================================
47
+
48
+ 現状、onLayoutに記述した横幅調整のOnItemSelectedの際、何らかの原因で無効になるのが原因ではと思い至りました。
49
+
50
+
51
+ 現状のプログラムでは、ボディへの値の代入はOnResumeと横幅調整のOnItemSelectedの際に行っています。この条件を変更した際、
52
+
53
+ OnResume:有効  OnItemSelected:有効⇒横幅調節「無効」
54
+ OnResume:有効  OnItemSelected:無効⇒横幅調節「有効」
55
+ OnResume:無効  OnItemSelected:有効⇒横幅調節「無効」
56
+
57
+ となりました。明らかに原因はOnItemSelectedと思われます。
58
+
59
+
60
+ ですが、OnItemSelected回りでブレークポイントを入れると、
61
+ OnItemSelectedで値入力⇒onLayoutの順番でコードが動いており、onLayoutの関数の中身
62
+ に代入される横幅の値は正しいように思えます。
63
+ (OnLayout内のボディの横幅はちゃんと「ボディに値を入力した後の」横幅が入力されていました。ですが
64
+ 最終的には誤った横幅で出力されます。・・・何故?)
65
+ これを踏まえて、下記の1、2の質問をしたいです。
66
+
67
+ 1.現状、下記のコードでTableLayout内のTableRow内のcellに横幅を代入しています。このコードの書き方は間違っているのでしょうか。
68
+
69
+
70
+ val Body = findViewById(R.id.tl_Body) as TableLayout//ボディのテーブルレイアウト。
71
+ val colWidths = LinkedList<Int>()//この中に最終的に入れたい横幅の値の一覧が入っている。中身の値は正しい。
72
+                   
73
+             for (rownum in 0 until Body.childCount) {
74
+ val row = Body.getChildAt(rownum) as TableRow
75
+ for (cellnum in 0 until row.childCount) {
76
+ val cell = row.getChildAt(cellnum)
77
+ val params = cell.layoutParams as TableRow.LayoutParams
78
+ params.width = colWidths[cellnum]
79
+ }
80
+
81
+ 2.OnLayoutのほかにレイアウトが変更される際に発動するプロパティをご存じでしょうか。その中に横幅調節の関数を入れて試してみます。
82
+ なお、OnMeasureは試してみましたがうまくいきませんでした。

1

文字の打ち間違いの訂正

2019/09/17 08:08

投稿

adk
adk

スコア12

title CHANGED
File without changes
body CHANGED
@@ -13,7 +13,7 @@
13
13
  │  ┌─────────────────────────────┐  │
14
14
  │  │   項目1    │ 項目2 │ 項目3 │  │
15
15
  │  └──────────────────┘──────────┘  │
16
- │        ボディ(ScrollVieww内のTableLayout)  
16
+ │        ボディ(ScrollView内のTableLayout)  
17
17
  │  ┌─────────────────────────────┐ │
18
18
  │  │ 1行目.項目1  │ 1行目.項目2 │ 1行目.項目3 │ │
19
19
  │  └──────────────────┘──────────┘ │
@@ -36,7 +36,7 @@
36
36
  うまくいきません。(「絞り込み欄」を変えてもヘッダー、ボディの横幅が合わない。)
37
37
 
38
38
  「絞り込み欄」のSpinnerのListnerを無効化するとonLayout内のプログラムが通り、横幅が合います。
39
- (SpinnerのLayoutの中ではボディへの値入力のみを行っています)
39
+ (SpinnerのListnerの中ではボディへの値入力のみを行っています)
40
40
 
41
41
  この現象の原因がわからないため、これが原因ではというアドバイスを頂けませんでしょうか。
42
42