Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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
Android 使用EditText进行双向数据绑定_Android_Data Binding_Kotlin - Fatal编程技术网

Android 使用EditText进行双向数据绑定

Android 使用EditText进行双向数据绑定,android,data-binding,kotlin,Android,Data Binding,Kotlin,我正在使用Kotlin开发一个简单的Android应用程序。我想使用数据绑定,但我无法让它们与EditText 这是我的XML布局 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"

我正在使用Kotlin开发一个简单的Android应用程序。我想使用数据绑定,但我无法让它们与
EditText

这是我的XML布局

<?xml version="1.0" encoding="utf-8"?>
<layout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <import type="de.knerd.applicationmanager.models.AgencyModel"/>
        <variable name="agency" type="AgencyModel"/>
    </data>
    <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            tools:showIn="@layout/activity_add_agency"
            tools:context="de.knerd.applicationmanager.activities.AddAgencyActivity"
            android:orientation="vertical"
            android:layout_margin="16dp">
        <android.support.design.widget.TextInputLayout android:layout_height="match_parent"
                                                       android:layout_width="match_parent">
            <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textPersonName"
                    android:ems="10"
                    android:id="@+id/name"
                    android:labelFor="@+id/name"
                    android:hint="@string/agency_name"
                    android:text="@={agency.name}"/>
        </android.support.design.widget.TextInputLayout>
    </RelativeLayout>
</layout>

你并没有按照原来的方式使用绑定。双向绑定的目的是让您可以从代码中访问对象或字段,而无需引用UI代码。通过执行binding.agency,您与findViewById()没有什么不同,您正在破坏绑定的目的

首先解决绑定问题。对对象模型使用BaseObservable,无论屏幕上的值发生什么变化,它都应该保持最新

那么,当您保存时,它应该是访问局部变量

private fun save(): Boolean {
    try {

        Log.d("Name", localObservableAgency.name)
        return true
    } catch (ex: Exception) {
        return false
    }
}
//不确定此方法的用途,猜测您正在尝试捕获null。更好的方法是只对对象执行null检查,因为通过访问null值捕获异常非常繁重,并且不会增加值。另外,Kotlin是空安全语言,因此您可能会丢失绑定上的值(可能是从将其设置为空开始),或者这里有些东西的编码很奇怪,因为如果您保留本地副本,您必须故意使对象为空。然而,你并没有保留一个本地副本,你只是内联更新一个,然后通过绑定访问,就好像它是你的变量库一样哈哈


长话短说,使用数据绑定的方式是否符合预期,您就不会有问题了。我猜这可能就是为什么有人投票否决了你。

我发现了这个问题,是因为我绑定到了错误的布局。正确的代码如下所示

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView<ActivityAddAgencyBinding>(this, R.layout.activity_add_agency)
    binding.agency = AgencyModel()
    val toolbar = findViewById(R.id.toolbar) as Toolbar
    setSupportActionBar(toolbar)
    supportActionBar!!.setDisplayHomeAsUpEnabled(true)
}
override-fun-onCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
binding=DataBindingUtil.setContentView(this,R.layout.activity\u add\u代理)
binding.agency=AgencyModel()
val toolbar=findviewbyd(R.id.toolbar)作为工具栏
设置支持操作栏(工具栏)
supportActionBar!!.setDisplayHomeAsUpEnabled(真)
}

在这两种情况下,我都必须绑定到活动布局

为什么要投反对票?那么,我该如何将绑定添加到视图中呢?它不是用于空检查,而是用于捕获SQLException,因此我使用的代码是Google根据我的类调整的示例代码。您应该接触绑定的唯一位置是在onCreate中为XML设置可观察的变量。这是一个临时的黑客攻击,直到谷歌迭代他们的绑定过程,不再需要它。如果您在保存例程中接触到绑定,则说明您使用的绑定不正确。我只是想帮你,但你当然可以随心所欲。很高兴你发现了你的问题。对不起,我有点粗鲁。你知道谷歌官方样本为什么有错吗?是的,我完全同意。看到它最终被采用是令人兴奋的,但现在它相当丑陋。我还与WPF和Silverlight合作多年,欣赏数据绑定代码的干净性。很高兴听到更多的人跳上舞台。:)很高兴认识我的朋友
private fun save(): Boolean {
    try {
        val agency = binding.agency
        Log.d("Name", agency.name)
        return true
    } catch (ex: Exception) {
        return false
    }
}
private fun save(): Boolean {
    try {

        Log.d("Name", localObservableAgency.name)
        return true
    } catch (ex: Exception) {
        return false
    }
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView<ActivityAddAgencyBinding>(this, R.layout.activity_add_agency)
    binding.agency = AgencyModel()
    val toolbar = findViewById(R.id.toolbar) as Toolbar
    setSupportActionBar(toolbar)
    supportActionBar!!.setDisplayHomeAsUpEnabled(true)
}