android - 为什么不调用“onPropertyChanged”?
问题描述
我正在编写一个具有 2 路数据绑定的应用程序。我可以更新编辑文本字段,但我也在尝试更新内部逻辑。我试图通过调用addOnPropertyChangedCallback(Observable.OnPropertyChangedCallback)
绑定来做到这一点,但是尽管观察者notifyPropertyChanged(int)
正在调用检查,但没有调用回调
我已尝试将注释添加到此 stackoverflow 问题@Bindable
中提到的 getter 和 setter,但无济于事。
AddItemObservable.kt
class AddItemObservable : BaseObservable(), AddItemImmutableObservable {
private var name = ""
private var quantity: Int? = null
@Bindable
override fun getName() = name
fun setName(name: String) {
if (this.name == name) {
return
}
this.name = name
notifyPropertyChanged(BR.name)
}
@Bindable
override fun getQuantity() = quantity
fun setQuantity(quantity: Int?) {
if (this.quantity?.equals(quantity) == true) {
return
}
this.quantity = quantity
notifyPropertyChanged(BR.quantity)
}
}
安卓视图.kt
class AndroidView : Fragment() {
private lateinit var binding: FragmentAddItemBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentAddItemBinding.inflate(inflater, container, false)
binding.addItem = AddItemObservable()
binding.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
Log.i("VIEW", "updated")
}
})
binding.lifecycleOwner = this
return binding.root
}
}
fragment_add_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<import type="tk.jonathancowling.inventorytracker.additem.AddItemObservable" />
<variable
name="addItem"
type="AddItemObservable" />
</data>
<LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:ems="10"
android:hint="@string/add_item_name"
android:inputType="textPersonName"
android:text="@={addItem.name}"
android:importantForAutofill="no"
tools:ignore="UnusedAttribute" />
<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:ems="10"
android:hint="@string/add_item_quantity"
android:inputType="number"
app:add_item_quantity="@={addItem.quantity}"
android:importantForAutofill="no"
tools:ignore="UnusedAttribute" />
</LinearLayout>
</layout>
为简洁起见省略了适配器
我希望在OnPropertyChangedCallback
被调用时被调用并记录“更新” notifyPropertyChanged
(当文本输入到其中之一时会发生这种情况EditText
)。
解决方案
要使其工作,您需要addOnPropertyChangedCallback
直接在Observable
实例上调用。例如,
val observableItem = AddItemObservable()
binding.addItem = observableItem
observableItem.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
Log.i("VIEW", "updated")
}
})
推荐阅读
- angular - Angular HttpClient 对象到数组
- sql - 如何将自定义字段中的整数值添加到 NetSuite 中的自定义日期字段?
- excel - 如何从同一模板为不同的输入/场景生成多个图表
- html - HTML - 背景图像定位
- google-chrome - Chrome 如何在 Android 上实现 WebUSB?
- uwp - 对 UWP 项目未解决的依赖项进行故障排除
- java - 部署 GAE Java 应用程序时出错
- java - Cassandra 在没有 Thread.sleep 的情况下抛出 WriteTimeout 异常
- terminal - vs代码的集成终端中出现不需要的符号
- c# - 为什么 FormClosing 事件会在使用 Monitors 的同步线程作业中产生死锁?