Android studioをアップデートしたらactivity_main.xmlのコンポーネントを使用できなくなった


何もしてないのにactivity_main.xmlが壊れた!!

本に従ってAndroidアプリを作成していたところ,なんでもないところでエラーが発生するようになった.
例えばこういうところ.

このbtStartが赤文字になり,Unresolved referenceだという.
上のbtStartはButtonの処理についてだが,Buttonに限らず同じ現象になる.

真っ先にタイポの可能性を考えたが,activity_main.xmlを確認すると間違っていないようだった.

ここの記載は教本通りだし,これまでにも何度も書いている.

考えられることとして,直前にAndroid studioをアップデートしていた.

そもそもactivity_main.xmlのオブジェクトをどうやって取得しているのか

基本的にはfindViewByIdを使ってボタンオブジェクトを取得する.

val btStart = findViewById<Button>(R.id.btStart)

(実際,別の教本ではfindViewByIdを使った方法を使用している.)
これを毎回実行するのが面倒なのでkotlin-android-extensionsというpluginを使用することで冒頭のような書き方ができる.

kotlin-android-extensionsを追加する

pluginをどこで読み込んでいるのか確認する.
app/build.gradle(:app)を覗いていみた.
アップデート前から使用している他のファイルはこんな感じ:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

(以下省略)

今回新規に作成したプロジェクトのファイルは次のような内容になっていた:

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

(以下省略)

どうやらkotlin-android-extensions のプラグインが入っていないらしい.
これを入れてみる.

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
}

あとはMainActivity.ktでimportする.
import kotlinx.android.synthetic.main.activity_main.*
を追加すると無事エラーが消えた.

pluginの書き方が変わっている点

上の比較を見ると同じpluginが使われていることがわかるが,書き方が若干変わっている.
...なぜなのか.

調べてみるとそれらしき記載が見つかった.
Gradle

The version should be literal in this block, and it cannot be applied from another build script.
Alternatively, you can use the older apply plugin approach:
apply plugin: 'kotlin'
It's not recommended that you apply Kotlin plugins with apply in Gradle Kotlin DSL – see why.

どうやらapply plugin: 'kotlin'は推奨されていないらしい.
これからはplugins {id 'com.android.application}を使った方が良さそう.
(というか最初からそうなっているのだろうが.)

めでたし,めでたし. というわけでもない

この件について調べているとこんな記事が見つかった.
Kotlin Android Extensions の未来
これを読む限り,kotlin-android-extensionsは推奨されておらず,近々削除されkotlin-parcelizeというのに変わるとのこと.
ここらへんは追々修正していかなければいけないようだ.