#この記事の概要
Viewにアクセスする最新の方法をメモしています。これまではfindViewById
やKotlin 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の利用を記述します。
android {
// 省略
viewBinding {
enabled = true
}
}
変更できたらsyncしましょう。
#ViewBindingでViewにアクセスする(Activity)
前準備ができたらActivityでは以下のようにアクセスします。
やるべきことは以下の3点です。
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を設定します。
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にじゃんじゃん新たな機能が付け加えられることで差別化されていくそうな。
#終わりに
何か間違っているよ、という部分等あればコメントよろしくおねがいします!!