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

Posted

技术标签:

【中文标题】如何将 dataBinding 与 spinner 一起使用并获取当前值?【英文标题】:How to use dataBinding with spinner and get the current value? 【发布时间】:2020-01-05 12:27:20 【问题描述】:

我正在使用 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_
                android:layout_
                android:layout_margin="15dp"
                android:entries="@array/cities"
                />

    </ScrollView>
</layout>
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) 
    


【问题讨论】:

【参考方案1】:

您可以使用多种选项。我只描述两个:

第一个是创建@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)
        
    

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

<Spinner
                android:id="@+id/citySpinnerSignUpLayout"
                android:layout_
                android:layout_
                android:layout_margin="15dp"
                android:entries="@array/cities"
                app:clicks="@=registerviewmodel.cityOfUser"
                />

你在 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
            
        )
    

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

第二种方法更容易一些

在 xml 中

<Spinner
                android:id="@+id/citySpinnerSignUpLayout"
                android:layout_
                android:layout_
                android:layout_margin="15dp"
                android:entries="@array/cities"
              tools:setOnItemSelectedListener="@registerviewmodel.clicksListener"
                />

而你的听众会是

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
        
    

这可能需要一些额外的工作,但一般方法是这样。希望对您有所帮助。

【讨论】:

那么哪个更好? @Slazer 没有“更好” - 您必须根据您的目标、架构和在整个应用中绑定的一般方法进行选择。

以上是关于如何将 dataBinding 与 spinner 一起使用并获取当前值?的主要内容,如果未能解决你的问题,请参考以下文章

Android开发,spinner应用,如何传参的问题

如何将额外元素插入到 SimpleCursorAdapter 或 Spinner 的光标中?

如何以编程方式将字体自定义字体设置为 Spinner 文本?

从多个 Listview 行中获取每个 Spinner 的值?

可以将 ViewModel 传递给 RecyclerView(无 DataBinding)吗?

如何在 Spinner 上添加浮动标签