Android 開発において、Spinnerというものがあります。
Webではselect
が挙げられると思われます。
selectでは、option要素にて、
<select name="example">
<option value="サンプル1">サンプル1</option>
<option value="サンプル2">サンプル2</option>
<option value="サンプル3" selected> サンプル3</option>
</select>
selected
を指定すれば、自動でサンプル3に選択されますが、
Androidの場合、初期値をXmlで指定することができなさそうでした。(もしあったら教えてほしい(´;ω;`))
ゆえに何を使うかと調べたところ、
val spinner: Spinner = findViewById(R.id.spinner)
spinner.setSelection(positon)
こんな感じでActivityやFragmentにて、Spinnerを呼び出しsetSelection()
メソッドを呼び出し、インデックスを指定するそうです。
しかし、自分はDataBindingやViewModelを勉強しだしており、ちょっと、ここにベタベタ書きたくない。。と思ってしまった。
ということでDataBindingを使った方法で切り抜けます。
やり方
1. Moduleを使えるようにする
まず、DataBindingとViewModelを実装できるようにします。
https://developer.android.com/topic/libraries/data-binding/start?hl=ja
↑DataBindingのスタートガイド
https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=ja
↑LifecycleのModuleの依存関係
こちらを参照して、build.gradle(app)
を変更して使える状態にします。
2. Xmlを変更
<Spinner
android:id="@+id/spinner_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="30dp"
android:OnItemSelected="@{ここに数値}"
ここのOnItemSelectedの中に、リスト何番目を選択してほしいか書いていきます。
現状でBuildしてもXmlのエラーが出ます。
3.メソッドを実装
https://developer.android.com/topic/libraries/data-binding/binding-adapters?hl=ja
こちらはBindingAdapterのメソッドの話があります。これを見れば、正直僕より参考になります。
僕は、カスタムロジックでやったので、Kotlin-kaptをapplyしなきゃでした。
apply plugin: 'kotlin-kapt'
その後、適当にファイルでも作って、メソッドを実装していきます。
BindingAdapter("android:OnItemSelected")
fun onItemSelected(view: Spinner, position: Int) {
view.setSelection(position)
}
こうすれば、FragmentやActivityに直接書き込むことはないので、ちょっとキレイかもしれません。
んで実際にBuildしてみると、指定した数値が最初に選択済になっていると思います!
DataBindingでやることで、ViewModel内で色々計算させて、ViewModelのメンバから参照するやり方もできるので、本来Fragmentで書いちゃうことを更に減らせちゃいます。
とっくに既知の技術ですが、自分的によく使いそうな手法だったので書いておきました。