【Android】TextViewの内容を動的に変更する方法
自作androidアプリ Flexible Dice
では、TextViewを動的に変更することでダイスロールを表現しています。
その際に結構迷ったので備忘録的にメモします。
方法
色々調べた結果、以下のことがわかりました。
・画面更新の方法としてinvalidate()
という命令文があるが、これはどうやら更新を予約するだけのものらしい。
・その場では更新されずinvalidate()
のスレッドが終了した後(アイドル時)に画面の更新が行われる。
・そもそもinvalidate()
はステータスを更新するほとんどの命令文(set○○()
など)の際に暗黙に実行されているらしい。
なので結論としては、invalidate()
は書く必要がなく、別スレッドでステータスを変更して元のスレッドに戻ればよいです。
そうすれば別スレッドが終了した時点で画面の更新が行われ、変更点が反映されます。
例
Thread{ }.start()
で別スレッドを生成することができます。
例えば、下記のプログラムは Flexible Dice Dice画面の左上に表示されているさいころの面と数を表すテキスト(1D10など)を動的に変更するスクリプトです。
Thread{ activity?.runOnUiThread { val textViewDice = view.findViewById<TextView>(R.id.textView_dice) textViewDice.text = "DICE: " + number.toString() + "D" + face.toString() } }.start()
アイデア次第でいろいろできそうですね。