3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Android】SpinnerをXmlのみで初期選択値を決める【Databinding&BindingAdapter】

Posted at

Android 開発において、Spinnerというものがあります。

image.png

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で指定することができなさそうでした。(もしあったら教えてほしい(´;ω;`))

ゆえに何を使うかと調べたところ、

Activity.kt
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しなきゃでした。

build.gradle(app)
apply plugin: 'kotlin-kapt'

その後、適当にファイルでも作って、メソッドを実装していきます。

BindingAdapters.kt
BindingAdapter("android:OnItemSelected")
fun onItemSelected(view: Spinner, position: Int) {
    view.setSelection(position)
}

こうすれば、FragmentやActivityに直接書き込むことはないので、ちょっとキレイかもしれません。

んで実際にBuildしてみると、指定した数値が最初に選択済になっていると思います!

DataBindingでやることで、ViewModel内で色々計算させて、ViewModelのメンバから参照するやり方もできるので、本来Fragmentで書いちゃうことを更に減らせちゃいます。

とっくに既知の技術ですが、自分的によく使いそうな手法だったので書いておきました。

3
3
0

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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?