двустороннее связывание с проверкой нуля - PullRequest
0 голосов
/ 04 мая 2018

В adatper привязки данных я хочу проверить, не равно ли значение int в моей модели нулю. Поскольку подсказка никогда не отображается, если значение равно 0 по умолчанию, то 0 отображается как текст. Я хочу показать подсказку, если значение равно нулю.

Работает ниже без проверки значения 0 int

   <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/port"
                android:inputType="number"
                android:text="@={`` + item.port}"
                />

Я пробовал это, которое не работает

   <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/port"
                android:inputType="number"
                android:text='@={item.port != 0 ? `` + item.port : ""}'
                />

item.port - это int значение

Любые предложения, чтобы сделать эту работу только с привязкой данных ?

Ответы [ 2 ]

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

Я думаю, вам понадобится BindingAdapter/InverseBindingAdapter или метод конвертации. Самый простой, вероятно, метод преобразования:

<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">
    <data>
        <import type="com.example.mount.teststuff.Conversion"/>
        <variable name="port" type="int"/>
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <EditText
            android:id="@+id/input"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@={Conversion.intToString(port, port)}"
            android:textSize="40sp"/>
        <TextView
            android:id="@+id/output"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{`` + port}"
            android:textSize="40sp"/>
    </LinearLayout>
</layout>

И в вашем классе преобразования у вас будет что-то вроде этого:

public class Conversion {
    @InverseMethod("stringToInt")
    public static String intToString(int oldValue, int value) {
        if (value == 0) {
            return null;
        }
        return String.valueOf(value);
    }

    public static int stringToInt(int oldValue, String value) {
        if (value == null || value.isEmpty()) {
            return 0;
        }
        try {
            return Integer.parseInt(value);
        } catch (NumberFormatException e) {
            return oldValue;
        }
    }
}

Я только что обновил ответ, включив в него мой проверенный макет и код. Вы можете найти более подробную информацию о этом сообщении в блоге .

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

<import type="Integer"/>

<android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/port"
                android:inputType="number"
                android:text='@={item.port}'
                />

Не хранить переменную порта как int, так как требуется двухстороннее связывание. Тип строки Setter для значения порта. Вместо этого преобразуйте строковое значение в целое в самом XML.

Обновление: вместо проверки нулевого на подсказку, пожалуйста, измените значение порта из вашей модели представления. если порт равен 0, вы можете заменить его пустой строкой "", а затем вызвать notifyPropertyChange (BR.port);

...