はじめに
TextView等のtextに「合計:1000円」や「合計:2000円」など、文字列の特定の数値だけを変えて表示したいときにはstrings.mxlに文字列リソースを用意してから、getStringで代入するというやり方をする。
しかし、困ったことにgetStringはActiviyやFragment外では使えない。今回はActiviyやFragment外でgetStringを使う方法についてまとめる。
instanceの設定
プロジェクトに存在するActivityで以下のように宣言する。
class MainActivity : AppCompatActivity() {
+ companion object {
+ lateinit var instance: MainActivity
+ private set
+ }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+ instance = this
// 関係ない部分は省略
}
}
getStringの利用
今回私はListAdapterの中で使いたかったので、その時の例を示す。
class CustomAdapter(
private val itemClickListener: OnItemClickListener
): ListAdapter<Item, ViewHolder>(DiffCallback) {
+ private val context = MainActivity.instance.applicationContext
+ private val resources = context.resources
// 省略
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ holder.itemName.text = resources.getString(R.string.item_name, item.itemName)
}
// 省略
}
この時strings.xmlには以下のように文字列が入っている。
<resources>
<string name="item_name">合計: %d 円</string>
</resources>
このようにすることで、getStringを利用している。
今回の場合、任意の金額を設定してtextに表示したいため、「合計: %d 円」となっている。
そのため、resources.getString(R.string.item_name, item.itemName)
のitem.itemName
が1000の場合は「合計: 1000 円」に、2000の場合は「合計: 2000 円」となる。
まとめ
今回はgetStringをActivityやFragment外で使って文字列を表示する方法をまとめた。
このやり方が違っていたり、もっといいやり方があるという場合はぜひ教えてください。
追記
コメントで上記やり方でなくてもgetStringが使える方法を教えてもらった。
class CustomAdapter(
private val itemClickListener: OnItemClickListener
): ListAdapter<Item, ViewHolder>(DiffCallback) {
// 省略
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ holder.itemName.text = holder.itemName.context.getString(R.string.item_name, item.itemName)
}
// 省略
}
ViewからContextやResourcesを取得できるため、この書き方をするだけでも良かった。