Включить макет на основе условия - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь включить макет в xml в зависимости от условия.

         <include
            android:id="@+id/ic_amountContainer"
            layout="@{viewModel.isDts3 ? @layout/layout_amount_edittext_container_dts3 : @layout/layout_amount_edittext_container}"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="16dp"
            app:amountDefault="@{viewModel.preApprovedAmountDefault}"
            app:amountMaxLength="@{safeUnbox(viewModel.preApprovedAmountMaxLength)}"
            app:layout_constraintTop_toBottomOf="@id/tv_preApproved" />

Оба макета имеют те же переменные, которые я передаю отсюда.

layout_amount_edittext_container_dts3. xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<data>

    <variable
        name="amountDefault"
        type="java.lang.String" />

    <variable
        name="amountMaxLength"
        type="java.lang.Integer" />

    <variable
        name="amountEditDisabled"
        type="Boolean" />

</data>

<LinearLayout
    android:id="@+id/ll_amountContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="start"
    android:layoutDirection="ltr"
    android:orientation="horizontal">


    <EditText
        android:id="@+id/et_amount"
        style="@style/AmountEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:enabled="@{!amountEditDisabled}"
        android:gravity="bottom"
        android:layoutDirection="locale"
        android:maxLength="@{amountMaxLength}"
        android:minWidth="60dp"
        android:text="@{amountDefault}"
        android:textSize="@dimen/text_size_48sp"
        tools:text="80,000" />

</LinearLayout>

layout_amount_edittext_container . xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<data>

    <variable
        name="amountDefault"
        type="java.lang.String" />

    <variable
        name="amountMaxLength"
        type="java.lang.Integer" />

    <variable
        name="amountEditDisabled"
        type="Boolean" />

</data>

<LinearLayout
    android:id="@+id/ll_amountContainer"
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:background="@drawable/et_background_rounded"
    android:gravity="center"
    android:layoutDirection="ltr"
    android:orientation="horizontal">

    <View
        android:id="@+id/v_amount1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <EditText
        android:id="@+id/et_amount"
        style="@style/AmountEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:gravity="bottom"
        android:layoutDirection="locale"
        android:maxLength="@{amountMaxLength}"
        android:minWidth="60dp"
        android:enabled="@{!amountEditDisabled}"
        android:text="@{amountDefault}"
        tools:text="80,000" />

    <View
        android:id="@+id/v_amount2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />
</LinearLayout>

Я получаю эту ошибку.

Ошибка: **** / ошибка привязки данных **** msg : включенное значение (@ {viewModel.isDts3? @ layout / layout_amount_edittext_container_dts3: @ layout / layout_amount_edittext_container}) должно начинаться с @ layout /. file: /Users/ashwani/StudioProjects/core-app-android/app/src/main/res/layout/layout_pfo_details.xml **** \ ошибка привязки данных ****

Просто не могу понять, что я делаю не так. Пожалуйста посоветуй. Я искал через inte rnet, но не смог найти тот же пример.

1 Ответ

0 голосов
/ 07 апреля 2020

Сообщение об ошибке сообщает, что значение свойства макета должно начинаться с @layout. Исходя из этого, невозможно применить желаемую логику c.

Однако существуют и другие решения.

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

например,

<include
        android:id="@+id/ic_amountContainer"
        layout="@layout/layout_amount_edittext_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        app:amountDefault="@{viewModel.preApprovedAmountDefault}"
        app:amountMaxLength="@{safeUnbox(viewModel.preApprovedAmountMaxLength)}"
        app:isDts3="@{viewModel.isDts3}"
        app:layout_constraintTop_toBottomOf="@id/tv_preApproved" />

А затем используйте значение внутри макета, чтобы установить видимость полей, которые вы не хотите видеть. Например,

android:visibility="@{isDts3 ? View.GONE : View.VISIBLE}"

или другая альтернатива:

Имейте два отдельных тега включения внутри основного макета и вместо них установите видимость. Я бы сказал, что это менее желательно, так как вы увеличиваете размер и сложность макета без необходимости, но решать вам.

...