Daily-Wine-Diary

アプリ開発中心

MENU

【Android】TextViewの内容を動的に変更する方法

自作androidアプリ Flexible Dice
では、TextViewを動的に変更することでダイスロールを表現しています。
その際に結構迷ったので備忘録的にメモします。

Google Play で手に入れよう


方法


色々調べた結果、以下のことがわかりました。
・画面更新の方法として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()

イデア次第でいろいろできそうですね。