Изменить значение Int при привязке данных нажатия кнопки - PullRequest
0 голосов
/ 09 мая 2018

Я могу сделать это программно, но я хочу знать лучший подход, используя android databinding.

Вот мой макет xml. Я хочу увеличить или уменьшить значение int onClick некоторой кнопки. Я не хочу обрабатывать клики в классе активности. Возможно ли это, если да.

В расположении ниже вы можете увидеть счетчик целых значений. Количество значений должно быть изменено при нажатии кнопки.

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

    <data>

        <import type="android.view.View"/>

        <variable
            name="activity"
            type="com.amelio.ui.activities.ActivityProductDetail"/>

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

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

        <Button
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:onClick="@{() -> count++}"
            android:text="Less"
            />

        <TextView
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@{`` + count}"
            />

        <Button
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:id="@+id/ivBtnPlus"
            android:onClick="@{() -> count--}"
            android:text="Add"
            />
    </LinearLayout>
</layout>

1 Ответ

0 голосов
/ 09 мая 2018

Это будет зависеть от того, чего вы пытаетесь достичь. Если вы хотите сделать свой код более тестируемым, я бы посоветовал вам обработать щелчок в XML, который вызовет функцию в вашем Activity или другом классе, где вы можете протестируйте поведение этой функции, и если вам нужно добавить более сложную логику, такую ​​как проверка данных, хранение базы данных и т. д., это будет лучше. В конце представление должно быть фиктивным, и это позволяет вам повторно использовать код, как в случае, если другая функция обрабатывает его.

Кроме того, наличие большого количества логики в XML - плохая практика, которая сделает ваш код неуправляемым. Я бы посоветовал вам прочитать о шаблоне MVVM и привязке данных Шаблон проектирования Android MVVM

Попробуйте это:

<Button
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:onClick="@{() -> activity.myCountMethod()}"
        android:text="Less"
        />

В Activity вы должны реализовать myCountMethod(), если вы не хотите, чтобы в вашей деятельности вы могли добавить еще одну переменную с классом, который вам нужен:

<data>

    <import type="android.view.View"/>

    <variable
        name="activity"
        type="com.amelio.ui.activities.ActivityProductDetail"/>
    <-- Add OtherClass -->
    <variable
        name="otherClass"
        type="com.amelio.ui.activities.OtherClass"/>

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


<Button
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:onClick="@{() -> otherClass.myCountMethod()}"
        android:text="Less"
        />

Вы можете найти больше информации здесь:

https://developer.android.com/topic/libraries/data-binding/expressions#listener_bindings

...