Android + Kotlin で findViewById が不要だった

テンプレートから Bottom Navigation Activity を選んで作成したときに定義していない変数があったのが気になった。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
}

見知らぬ navigation という変数があって import にも存在しない。
調べてみると、

import kotlinx.android.synthetic.main.activity_main.*

を記述しておくと該当する layout の xml で android:id="@+id/navigation" の ID がそのまま変数として使用できる。

余談

button.setOnClickListener {
    Log.d("DEBUG", "Before:" + user.toString())
    user.firstName.set("Jiro")
    Log.d("DEBUG", "After:" + user.toString())
}

をデコンパイルしてみたらこんなコードになっていた。

private HashMap _$_findViewCache;

protected void onCreate(@Nullable Bundle savedInstanceState) {
    // 〜中略〜
    ((Button)this._$_findCachedViewById(id.button)).setOnClickListener((OnClickListener)(new OnClickListener() {
        public final void onClick(View it) {
            Log.d("DEBUG", "Before:" + user.toString());
            user.getFirstName().set("Jiro");
            Log.d("DEBUG", "After:" + user.toString());
        }
    }));

public View _$_findCachedViewById(int var1) {
    if (this._$_findViewCache == null) {
        this._$_findViewCache = new HashMap();
    }

    View var2 = (View)this._$_findViewCache.get(var1);
    if (var2 == null) {
        var2 = this.findViewById(var1);
        this._$_findViewCache.put(var1, var2);
    }

    return var2;
}

public void _$_clearFindViewByIdCache() {
    if (this._$_findViewCache != null) {
        this._$_findViewCache.clear();
    }
}

参考