Почему не вызывается onPropertyChanged? - PullRequest
0 голосов
/ 11 февраля 2019

Я пишу приложение с двухсторонней привязкой данных.Я могу получить поле редактирования текста для обновления, но я также пытаюсь обновить внутреннюю логику тоже.Я попытался сделать это, вызвав addOnPropertyChangedCallback(Observable.OnPropertyChangedCallback) для привязки, однако, несмотря на проверку, что notifyPropertyChanged(int) вызывается наблюдаемой, обратный вызов не вызывается

Я пытался добавить @Bindable аннотация как к получателю, так и к установщику, как упомянуто в этом вопросе о потоке стека , но безрезультатно.

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)
    }
}

AndroidView.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
    }
}

фрагмент_адд_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).

1 Ответ

0 голосов
/ 11 февраля 2019

Чтобы это работало, вам нужно вызвать addOnPropertyChangedCallback непосредственно на Observable экземпляре.Например,

val observableItem = AddItemObservable()
binding.addItem = observableItem
observableItem.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() { 
    override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
        Log.i("VIEW", "updated")
    } 
}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...