Не удается найти атрибут android:onTextChanged в xml при использовании привязки данных

Я не могу найти атрибут android:onTextChanged в EditText при реализации привязки данных к моему фрагменту xml. Я искал ответ и этот сказал, что поддерживается из коробки. я установил

data-binding { enable = true }

в моем build.gradle, а моя текущая сборка 3.5.3.

Вот часть моего xml:

<layout>

    <data>

        <variable
            name="vm"
            type=".ViewModel" />
    </data>

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        tools:context=".screens.hangouts.create_hangout_new.Step1FragmentNew">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rv_category"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/tv_hangout_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintTop_toBottomOf="@id/rv_category" />

            <EditText
                android:id="@+id/et_hangout_name"
                android:background="@drawable/bkg_stroke_red"
                android:layout_width="match_parent"
                android:layout_height="30dp"
                app:layout_constraintTop_toBottomOf="@id/tv_hangout_name" />
...

person Dung Nguyen    schedule 30.12.2019    source источник
comment
вы используете котлин или java?   -  person haresh    schedule 30.12.2019
comment
@haresh Я использую в своем проекте и java, и kotlin. Но в основном джава. Это причина, по которой я не могу найти атрибут onTextChanged?   -  person Dung Nguyen    schedule 31.12.2019
comment
бро ты нашел решение?? Я тоже исходю из этого вопроса..   -  person ken    schedule 12.01.2020


Ответы (4)


Вы можете использовать

 android:afterTextChanged="@{(editable)->viewModel.afterEmailTextChanged(editable)}"

установить функцию в вашей модели просмотра

public void afterEmailTextChanged(CharSequence s) {
    user.setEmail(s.toString());
}
person Nidhi Desai    schedule 30.12.2019
comment
Проблема в том, что я не могу найти ни один из этих атрибутов в EditText, включая android:onTextChanged, android:beforeTextChanged, android:afterTextChanged - person Dung Nguyen; 31.12.2019

В вашем xml-файле:

<EditText
   android:id="@+id/et"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   app:textChangedListener="@{model.textWatcher}"  />  

В вашем коде, подобном этому, в вашем классе модели:

public class Model{
private TextWatcher textWatcher;

public Model(){
        this.textWatcher= getTextWatcherIns();
}

private TextWatcher getTextWatcherIns() {
        return new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                //do some thing
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //do some thing

            }

            @Override
            public void afterTextChanged(Editable s) {
                //do some thing
            }
        };
    }

    public TextWatcher getTextWatcher() {
        return textWatcher;
    }

    public void setTextWatcher(TextWatcher textWatcher) {
        this.textWatcher = textWatcher;
    }

    @BindingAdapter("textChangedListener")
    public static void bindTextWatcher(EditText editText, TextWatcher textWatcher) {
        editText.addTextChangedListener(textWatcher);
    }
}

Для получения дополнительной информации об этом прочитайте этот документ. Также включите в свой ответ app:textChangedListener в EditText и попробуй.

Я надеюсь, что это поможет вам...!

person Viral Patel    schedule 30.12.2019
comment
Спасибо за ответ, но это не решает мою проблему. Я не могу найти атрибут onTextChanged в EditText, хотя они говорят, что он поддерживается из коробки. - person Dung Nguyen; 31.12.2019

Вы можете использовать двустороннюю привязку, если используете привязку данных, как показано ниже.

<EditText
            android:id="@+id/et_hangout_name"
            android:background="@drawable/bkg_stroke_red"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:text="@={viewmodel.textChangedMutableLiveData}"
            app:layout_constraintTop_toBottomOf="@id/tv_hangout_name" />

Затем в вашей модели просмотра

var textChangedMutableLiveData = MutableLiveData<String>()

var textChangedLiveData = textChangedMutableLiveData.map {
    // here you get the changed text every time user types something. now you can observe textChangedLiveData in your activity and do whatever you wanna do when text changes. 
}
person Abhishek Kumar    schedule 02.01.2020

Вам нужно определить BindingAdapter, чтобы использовать его в XML, например android:afterTextChanged

Определите где-нибудь в вашем проекте

@BindingAdapter("android:afterTextChanged")
public static void setListener(TextView view, TextViewBindingAdapter.AfterTextChanged after) {
        setListener(view,after);
    }

Код приведен здесь: эта ссылка

person ken    schedule 12.01.2020