ViewBindingに移行していきます

#この記事の概要
Viewにアクセスする最新の方法をメモしています。これまでは`findViewById`や`Kotlin Android Extension`などがViewにアクセスする方法としてありましたが、現在は`ViewBinding`を使った方法が推奨されております。[Android Developers | ViewBinding](https://developer.android.com/topic/libraries/view-binding?hl=ja)

#これまでのViewへのアクセス方法
`findViewbyId`を使ってViewにアクセスする方法は以下が例です。

```kotlin
 val titleInputText = findViewById<EditText>(R.id.title_input_text_view)
 postTitle = titleInputText.text.toString()
```

また、`Kotlin Android Extension`でViewにアクセスする方法は以下が例です。

```kotlin
btn_job_register.setOnClickListener {
        val intent = Intent(this, MainActivity::class.java)
        startActivity(intent)
}
```

#ViewBindingを使うための前準備
app/build.gradleにviewBindingの利用を記述します。

```kotlin:app/build.gradle
android {
    // 省略
    viewBinding {
        enabled = true
    }
}
```
変更できたらsyncしましょう。

#ViewBindingでViewにアクセスする(Activity)
前準備ができたらActivityでは以下のようにアクセスします。
やるべきことは以下の3点です。

```kotlin:UserRegisterActivity.kt
class UserRegisterActivity : AppCompatActivity() {

    // TIPS: bindingクラスをlateinit varで宣言する
    private lateinit var binding: ActivityUserRegisterBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // TIPS: bindingの初期化とついでにsetContentViewも行います
        binding = ActivityUserRegisterBinding.inflate(layoutInflater)
            .apply { setContentView(this.root) }

        // TIPS: アクセスしたいViewのidはロワーキャメルケースにしたものに勝手に代わります
        binding.btnUserRegister.setOnClickListener {
            val intent = Intent(this, JobRegisterActivity::class.java )
            startActivity(intent)
        }
    }
}
```

#ViewBindingでViewにアクセスする(Fragment)
また、Fragmentでは以下のようにViewBindingを設定します。

```kotlin:RecordFragment.kt
class RecordFragment: Fragment(),
      RecordAfterCustomViewDelegate,
      RecordBeforeCustomViewDelegate,
      RecordNowOnCustomViewDelegate {

    // TIPS: bindingの変数宣言を行う
    private var _binding: FragmentRecordBinding? = null
    private val binding
            get() = _binding!!

// TIPS: onCreateViewではbindingの初期化を行います
// TIPS: 逆に言えばbindingの初期化以外の処理は行わず、bindingの初期化以外の処理を記述したい場合はonViewCreatedにします。
override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
　　　　// TIPS: rootViewは不要になります
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }

// TIPS: Viewに実際にアクセスしたり、binding以外の処理をここで行います。つまり、bindingの初期化以外の処理をここに記述します。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Viewの処理
        binding.hogehoge.text = "hogehoge"
　　    // bindingの初期化以外の処理
        callHomeViewModel()
}

// TIPS: fragmentでは閉じられる（destory）される時にbindingをクリアにする処理が必要になります
override fun onDestroyView() {
     super.onDestroyView()
     _binding = null
}

```

#追記：DataBindingとの違いについて
・DataBinding = データをコードからViewにバインド + Viewをコードにバインド
・ViewBinding = Viewをコードにバインド
つまり、ViewBindingはDataBindingからViewへのバインド機能のみを取り出して独立させたものです。

もともとはDataBindingが先にありましたが、微妙に使いづらい点が多く当時のエンジニアには不評でしたが、簡単にViewにアクセスできる点は非常によく、それを目的にDataBindingを利用するエンジニアが増え、ViewBindingがつくられたそうな。

そして、現在公式が推奨しているアーキテクチャ(MVVM)にもDataBindingは使われることがないのでいづれ消えてなくなるかViewBindingにじゃんじゃん新たな機能が付け加えられることで差別化されていくそうな。 

#終わりに
何か間違っているよ、という部分等あればコメントよろしくおねがいします！！