AndroidOのfindViewByIdの仕様変更

  • 24
    いいね
  • 0
    コメント

Google I/Oでは歓声が上がっていた(?)、Android OからのfindViewByIdの総称型対応について

findViewById

API Level 26からはfindViewByIdに総称型が追加されています。

Java

Javaではキャストする手間が減り記述量が減るようになりました。

image.png

バイトコード的には変更がないので、compileSdkVersionによって生成されるバイトコードは(恐らく)変化しません。

Kotlin

一方、KotlinではcompileSdkVersionを26に上げると、タイプパラメーターの推論ができないため、25までの記述はコンパイルエラーになります。

image.png

以下のように、タイプパラメーターを指定するか、推論できるようにすればコンパイルは通ります。

// こっちだとTextView!!になるので
val text26_1 = findViewById<TextView>(android.R.id.text2)
// 型を明示するほうが良さそう
val text26_2: TextView = findViewById(android.R.id.text2)

もしくは、予めfindViewByIdをラッピングする拡張を作っておくといいかもしれません。

// compileSdkVersion 25
@Suppress("UNCHECKED_CAST")
fun <V : View?> Activity.find(@IdRes id: Int): V = findViewById(id) as V
// compileSdkVersion 26
fun <V : View?> Activity.find(@IdRes id: Int): V = findViewById<V>(id)

ButterKnifeとか使っていれば恐らくこの問題は発生しないと思いますが、KotlinAndroiderはお気をつけください。