Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android(Kotlin)具有非字符串基元类型的双向数据绑定_Java_Android_Kotlin_Data Binding - Fatal编程技术网

Java Android(Kotlin)具有非字符串基元类型的双向数据绑定

Java Android(Kotlin)具有非字符串基元类型的双向数据绑定,java,android,kotlin,data-binding,Java,Android,Kotlin,Data Binding,我尝试在Android中进行双向数据绑定(模拟Pixel3A运行API级别29,最小API目标为21)。我想在EditText的android:text属性上使用@={}语法 似乎说我们可以使用静态转换器类来转换原始(或者可能是复杂)数据类型,使用注释来描述哪些方法与其他方法相反。我目前正在与ints合作,但至少也将与Double合作 从Int到字符串的转换方法可以很好地工作。当我的片段的布局膨胀时会调用它(尽管奇怪的是,它会立即调用两次),但是调试器永远不会影响从字符串到int的转换 数据绑定

我尝试在Android中进行双向数据绑定(模拟Pixel3A运行API级别29,最小API目标为21)。我想在EditText的
android:text
属性上使用
@={}
语法

似乎说我们可以使用静态转换器类来转换原始(或者可能是复杂)数据类型,使用注释来描述哪些方法与其他方法相反。我目前正在与ints合作,但至少也将与Double合作

从Int到字符串的转换方法可以很好地工作。当我的片段的布局膨胀时会调用它(尽管奇怪的是,它会立即调用两次),但是调试器永远不会影响从字符串到int的转换

数据绑定转换器.kt

package com.razelon.svcman.database
导入android.widget.EditText
导入androidx.databinding.InverseMethod
对象数据绑定转换器{
@JvmStatic
@反向方法(“intToString”)
有趣的字符串输入(v:EditText,旧:Int,新:String):Int{
返回new.toInt()
}
@JvmStatic
有趣的intToString(v:EditText,旧:Int,新:Int):字符串{
返回新的.toString()
}
}
fragment_new_order.xml摘录:


//其他观点
FragmentNewOrderViewModel.kt

package com.razelon.svcman.orders
导入android.app.Application
导入androidx.databinding.Bindable
导入androidx.lifecycle.AndroidViewModel
导入androidx.lifecycle.LiveData
导入androidx.lifecycle.MutableLiveData
导入com.razelon.svcman.database*
导入kotlinx.coroutines.CoroutineScope
导入kotlinx.coroutines.Dispatchers
导入kotlinx.coroutines.Job
导入kotlin.math.max
const val MAX_WORK_code=5
类FragmentNewOrderViewModel(
val数据库:SvcDao,
应用程序:应用程序
):AndroidViewModel(应用程序){
private val job=job()
private val uiScope=CoroutineScope(Dispatchers.Main+job)
private val_listWorkCodes=MutableLiveData(listOf())
private val_listParts=MutableLiveData(listOf())
private val_eventResetOrder=MutableLiveData(false)
val servicemens=database.getallservicemens()
val listWorkCodes:LiveData
get()=\u listWorkCodes
val listSvcParts:LiveData
get()=\u listParts
val eventResetOrder:LiveData
get()=\u eventResetOrder
val orderNo=MutableLiveData(0)
fun addWorkCode():布尔值{
如果(\u listWorkCodes.value!!.size>=最大工作\u代码){
返回错误
}
_listWorkCodes.value=列表(\u listWorkCodes.value!!.size+1){
如果(它<(_listWorkCodes.value!!.size)){
_listWorkCodes.value?获取(它)!!
}否则{
工作代码(0)
}
}
返回真值
}
乐趣更新工作代码(代码:工作代码){
}
工作代码(位置:Int){
_listWorkCodes.value=列表(最大值(\u listWorkCodes.value!!.size-1,0)){
如果(it>=pos)\u listWorkCodes.value!![it+1]否则\u listWorkCodes.value!![it]
}
}
fun addNewPart(){
_listParts.value=列表(\u listParts.value!!.size+1){
如果(它<\u listParts.value!!.size){
_listParts.value!![it]
}否则{
SvcPart(“”,0.0,1)
}
}
}
零件(位置:Int){
_listParts.value=列表(最大值(_listParts.value!!.size-1,0)){
如果(it>=pos)\u listParts.value!![it+1]否则\u listParts.value!![it]
}
}
新订单(){
_eventResetOrder.value=true
_listParts.value=listOf()
_listWorkCodes.value=listOf()
}
fun onOrderReset(){
_eventResetOrder.value=false
}
}

我不明白为什么它不调用由
@InverseMethod(“intToString”)
注释标记的反向转换器。我在类声明中使用了
object
关键字,用所需的注释标记了方法,将类型导入到布局数据绑定中,并将方法中的参数按照文档进行匹配。我是Kotlin和Android开发的新手,所以我相信这可能是我很容易忽略的事情,但是任何关于我在这里遗漏的东西的见解都会很感激。

我发现了,这完全是我的错。在文章中没有显示,但在我的片段中,我从来没有实际将布局中的变量分配给我的绑定,因此它没有任何东西可以将值发送回

设置此选项为我修复了它,因为我以前忘记了它:

FragmentNewOrder.kt

val-app=this.activity!!。应用
val ds=SvcDatabase.getInstance(app.DAO)
val工厂=FragmentNewOrderViewModelFactory(ds,应用程序)
val视图模型=
ViewModelProviders.of(this,factory).get(FragmentNewOrderViewModel::class.java)

//非常重要的是,别忘了绑定数据我发现了,这完全是我的错。在文章中没有显示,但在我的片段中,我从来没有实际将布局中的变量分配给我的绑定,因此它没有任何东西可以将值发送回

设置此选项为我修复了它,因为我以前忘记了它:

FragmentNewOrder.kt

val-app=this.activity!!。应用
val ds=SvcDatabase.getInstance(app.DAO)
val工厂=FragmentNewOrderViewModelFactory(ds,应用程序)
val视图模型=
ViewModelProviders.of(this,factory).get(FragmentNewOrderViewModel::class.java)
//非常重要,不要忘记绑定数据