以前書いた記事
画像名を文字列で指定してImageViewに貼り付けるコード(android)
これにLGTMしていただいていたので見てみたのですが、微妙だったので書き直します(ついでにkotlinで)
リソース名からImageViewに画像をセットするメソッドは、swiftにはあるんですがkotlinだとありそうでないです。
ちなみにswiftでは
imageView.image = UIImage(named:"hoge.png")
こんな感じでimageViewに画像をセットできます。
同じようなものをkotlinで再現してみます。
resourceIdを文字列から取得
StringExtensions.kt
fun String.getResourceId(context: Context): Int {
return context.resources.getIdentifier(this, "drawable", context.packageName)
}
Stringの拡張クラスを定義しました
画像をImageViewにセット
ImageViewExtensions.kt
fun ImageView.setImageResourceByName(name: String) {
this.setImageResource(name.getResourceId(context))
}
ImageViewクラスの拡張を定義しました。
使用例
private fun setImage() {
val imageView = ImageView(this)
imageView.setImageResourceByName("some_image_name_string")
parent_view.addView(imageView)
}
parent_viewに動的にImageViewを追加しています
kotlinっぽい書き方をすると
private fun setImage() {
parent_view.addView(
ImageView(this).apply {
setImageResourceByName("some_image_name_string")
}
)
}
こんな感じでしょうか。
最初は見にくいなと思っていたのですが、「parent_viewに画像を追加する」という責務がひとかたまりで表せるので個人的には気に入っています。
swiftとの比較
swift
imageView.image = UIImage(named:"some_image_name_string.png")
kotlin
imageView.setImageResourceByName("some_image_name_string")
大体似たような感じになったかと思います。
上記で定義したStringとImageViewの二つの拡張をコピペすればそのまま使えます。