大体皆さん "android フォント 自動" "android Textview 横幅" とかでググって、TextViewを継承したクラスの実装を見かけたと思います。
参考
http://dev.classmethod.jp/smartphone/android-font-fit-text-view/ https://gist.github.com/STAR-ZERO/2934490
この2つの実装の違いはonMeasureかonLayoutでやってるかの違いですが、それはまあ置いておいて。 これらをListViewの内部で使おうとしたら残念な結果になってしまいました。 もしくはListViewじゃなくても、setTextを繰り返し行う場合には同じ結果になるかもしれません。
起きた現象
以下の手順を同じtextViewに行います
- 横幅を超えないテキストをセットする→期待どおり
- 横幅を超えるテキストをセットする→期待通り
- 再び横幅を超えないテキストをセットする→ 2.のサイズから戻らず小さいまま
解決策
setText後にsetWidthを呼ぶ
textView.setText(text); textView.setWidth(getContext().getResources().getDimensionPixelSize(R.dimen.width));
理屈
テキストサイズの調整をonLayoutもしくはonMeasureで行っているので、当然onLayout, onMeasureが呼ばれなければリサイズされません。
setTextI()を呼んでonLayoutが走るのは 現在のwidthよりも大きいサイズのテキストがセットされた時
だけのようでした。そのため、現在のwidthに収まる範囲のテキストをセットしてもonLayoutは呼ばれません。
本来はレイアウトを設定し直す必要がないので当然ですが、今回は毎回呼んでもらわないと困るので、強引に元からセットしてあるwidthと同じ値を再度セットすることで強引にonLayoutを呼び出すことで解決しました。
なんか他にonLayoutを走らせるいい感じのメソッドがあるかもしれませんが調べてません。
おわり。