Как добавить onTextChanged слушатель в XML-макет включения путем привязки данных в Android - PullRequest
0 голосов
/ 24 января 2019

У меня проблема с добавлением onTextChanged к TextInputEditText в включаемом макете .

Существует base_edittext_view.xml, как показано ниже:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">


<android.support.design.widget.TextInputLayout
    android:id="@+id/textInputLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColorHint="@color/colorPrimaryText"
    android:background="@drawable/textinputlayout_background"
    app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/edittextItem"
        style="@style/TextStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/input_border_bottom"
        android:cursorVisible="true"
        android:drawableEnd="@drawable/ic_user"
        android:drawablePadding="@dimen/padding_medium"
        android:gravity="center|left"
        android:hint="@string/email"
        android:inputType="textEmailAddress"
        android:maxLength="50"
        android:paddingBottom="@dimen/padding_medium"
        android:paddingTop="@dimen/padding_medium"
        android:paddingEnd="@dimen/padding_xlarge"
        android:paddingStart="@dimen/padding_medium"
        android:textColor="@color/edittext_text_color"
        android:textColorHint="@color/edittext_hint_text_color"
        android:textSize="@dimen/textsize_medium"
      />

   <!---->

</android.support.design.widget.TextInputLayout>

Я хочу добавить прослушиватель onTextChanged в макет, который включает base_edittext_view.xml.

android:onTextChanged="@{(text, start, before, count) -> viewModel.onTextChanged(text)}"

Нет проблем для добавления onClick в include layout , но для onTextChanegd я не знаю, как этого добиться.

Примечание:

     <include
                android:id="@+id/edittextEmail"
                layout="@layout/edittext_email_base_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/padding_xxxxlarge"
                />

1 Ответ

0 голосов
/ 24 января 2019

Вы можете сделать это, передав onTextChanged включенному макету.Смотрите пример -

Это base_edittext_view.xml

<data>

    <variable
        name="onTextChanged"
        type="androidx.databinding.adapters.TextViewBindingAdapter.OnTextChanged" />
</data>

<com.google.android.material.textfield.TextInputEditText
   ...            
   android:onTextChanged="@{onTextChanged}" />

Теперь вы можете передать onTextChanged включенному макету, как показано ниже.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <include
        layout="@layout/base_edittext_view"
        app:onTextChanged="@{(text, start, before, count) -> viewModel.onTextChanged(text)}"/>

</LinearLayout>

------------- Вот и все!

Может быть МНОГИЕ другие способы реализовать это.Я хотел бы поделиться с вами ПОЛНОЙ ИНФОРМАЦИЕЙ.

WAY 2

Вы можете создать другую переменную данных в родительском макете.И включите его, чтобы включить макет, как указано выше.Как показано ниже -

<data>

    <variable
        name="onTextChanged"
        type="androidx.databinding.adapters.TextViewBindingAdapter.OnTextChanged" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <include
        layout="@layout/base_edittext_view"
        app:onTextChanged="@{onTextChanged}" />

</LinearLayout>

И затем вы можете реализовать OnTextChanged в Activity / ViewModel (где вам нужно).

binding.setOnTextChanged(new TextViewBindingAdapter.OnTextChanged() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // do you work.
    }
});

WAY 3

ИЛИ, если вы не хотите использовать другую переменную в родительском макете, , тогда вы можете напрямую передать onTextChanged во включенный макет из класса Java / Kotlin.Смотрите пример -

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <include
        android:id="@+id/includedEditText"
        layout="@layout/base_edittext_view"
        />

</LinearLayout>

Затем из класса Java -

binding.includedEditText.setOnTextChanged(new TextViewBindingAdapter.OnTextChanged() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
     // your work
    }
});

Также может быть много других способов.Например, создание собственного метода во ViewModel / Activity и вызов этого метода из макета.

...