Android: привязка данных: предоставление значений во включенных макетах

У меня есть следующий макет - text_input_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="textType" type="String"/>
    </data>
    <TextInputLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        app:errorEnabled="true"
      android:textColorHint="@color/white"
        android:layout_height="wrap_content"
        android:layout_width="match_parent">

        <android.support.design.widget.TextInputEditText
            android:textColor="@color/White"
            android:backgroundTint="@color/White"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:maxLines="1"
            android:inputType="@{textType}"
            android:id="@+id/password" />
    </TextInputLayout>
</layout>

Я хотел бы включить этот макет в другой макет, но измените inputType на textPassword, textEmail и т. Д. В зависимости от требования.

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

    <RelativeLayout
        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"
        >

        <include layout="@layout/text_input_layout"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
app:textType="textPassword"/>

    </RelativeLayout>
</layout>

Я пытался использовать привязку данных, но это не похоже на работу. Может ли кто-нибудь помочь, пожалуйста?

Благодарю.

1 ответ

textPassword это не строка Это attributeтак что вы не можете передать его какapp:textType="textPassword",app:textType принять целочисленное значение.

Решение

1) ВозьмиtextTypeкакIntegerзначение.

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="textType"
            type="Integer"/>
    </data>

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

        <android.support.design.widget.TextInputEditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="@{textType}"
            />
    </android.support.design.widget.TextInputLayout>
</layout>

2) пройтиIntegerв<includeтег app:textType,

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <import type="android.text.InputType"/>

    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <include
            layout="@layout/sample"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:textType="@{(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)}"
            />

    </android.support.constraint.ConstraintLayout>
</layout>

Вы также можете пройти 1,2,3... без импортаInputTypeно это должно быть в силеInputType,

int TYPE_CLASS_TEXT = 1;
int TYPE_TEXT_VARIATION_PASSWORD = 128;
Другие вопросы по тегам