LoginSignup
33
19

More than 1 year has passed since last update.

ViewBindingに移行していきます

Last updated at Posted at 2020-11-25

この記事の概要

Viewにアクセスする最新の方法をメモしています。これまではfindViewByIdKotlin Android ExtensionなどがViewにアクセスする方法としてありましたが、現在はViewBindingを使った方法が推奨されております。Android Developers | ViewBinding

これまでのViewへのアクセス方法

findViewbyIdを使ってViewにアクセスする方法は以下が例です。

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

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

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

ViewBindingを使うための前準備

app/build.gradleにviewBindingの利用を記述します。

app/build.gradle
android {
    // 省略
    viewBinding {
        enabled = true
    }
}

変更できたらsyncしましょう。

ViewBindingでViewにアクセスする(Activity)

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

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を設定します。

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にじゃんじゃん新たな機能が付け加えられることで差別化されていくそうな。

終わりに

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

33
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
19