如何将 dataBinding 与 spinner 一起使用并获取当前值?

Ali*_*med 3 xml data-binding android spinner kotlin

我正在使用 MVVM 和数据绑定( Kotlin )开发一个 Android 应用程序,我想知道如何轻松获取 ViewModel 中微调器的当前值并轻松处理它。我知道这个问题被问了很多次,但实际上我没有得到有用的答案,所以你能帮助大家吗?感谢你的帮助。谢谢。


<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="registerviewmodel"
            type="com.AAA.BBB.SignUpAuthViewModel" />
    </data>
<Spinner
                android:id="@+id/citySpinnerSignUpLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="15dp"
                android:entries="@array/cities"
                />

    </ScrollView>
</layout>
Run Code Online (Sandbox Code Playgroud)
class SignUpAuthViewModel : ViewModel() {

    var username: String? = null
    var password: String? = null
    var town: String? = null
    var age: String? = null
    var phone: String? = null
    var passwordConfirmation: String? = null



//this variable should hold the city of the user
// from spinner of cities
var cityOfUser: String? = null



    fun OnRegisterButtonClicked(view: View) {
    }

    fun onRegisterTextViewClicked(view: View) {
    }
}

Run Code Online (Sandbox Code Playgroud)

Pav*_*sha 6

您可以使用多种选项来实现此目的。我只描述两个:

第一个是创建@BindingAdapter如下所示:

@BindingAdapter("clicks")
fun listenClicks(spinner: AppCompatSpinner, result: ObservableField<String>) {
    spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {

        }

        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            result.set(parent.getItemAtPosition(position) as String)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在 xml 中你将像这样绑定它

<Spinner
                android:id="@+id/citySpinnerSignUpLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="15dp"
                android:entries="@array/cities"
                app:clicks="@={registerviewmodel.cityOfUser}"
                />
Run Code Online (Sandbox Code Playgroud)

viewModel 中的变量应该看起来像

val cityOfUser = ObservableField<String>().apply {
        addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback(){
            override fun onPropertyChanged(sender: Observable?, propertyId: Int) { 
                Log.d("value",this@apply.get()) //selected value
            }
        })
    }
Run Code Online (Sandbox Code Playgroud)

-------------------------------------------------- ----------------------------

第二种方法更容易一些

在 XML 中

<Spinner
                android:id="@+id/citySpinnerSignUpLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="15dp"
                android:entries="@array/cities"
              tools:setOnItemSelectedListener="@{registerviewmodel.clicksListener}"
                />
Run Code Online (Sandbox Code Playgroud)

而你的听众会是

val clicksListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {

        }

        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            cityOfUser = parent.getItemAtPosition(position) as String
        }
    }
Run Code Online (Sandbox Code Playgroud)

它可能需要一些额外的工作,但一般方法是这样的。希望能帮助到你。