双向数据绑定转换器

时间:2020-01-08 11:01:26

标签: android android-viewmodel two-way-binding

我正在为password双向数据绑定字段使用从CharArray到String的转换器。

var password = ObservableField<CharArray>()

doc之后:

public class Converter {
    @InverseMethod("stringToCharArray")
    public static String charArrayToString(
            ClearableEditText view,
            char[] oldValue,
            char[] value
    ){
        return value.toString();
    }

    public static char [] stringToCharArray(
            ClearableEditText view,
            String oldValue,
            String value
    ){
        return value.toCharArray();
    }
}

在XML文件中,我像这样使用它:

android:text="@={Converter.charArrayToString(viewModel.password)}"

但是我仍然有下面的异常:

error: Could not find inverse method: public static char[] stringToCharArray(ClearableEditText, char[], java.lang.String)
    public static String charArrayToString(
                         ^   

2 个答案:

答案 0 :(得分:0)

您必须提供BindingAdapterInverseBindingAdapter用于两种方式的数据绑定。尝试使用下面的绑定适配器。

@BindingAdapter("android:text")
public static void bindArrayInText(TextView view, char[] value) {
    view.setText(String.valueOf(value));    
}

@InverseBindingAdapter(attribute = "android:text")
public static char[] getArrayFromText(TextView view) {
    String value = view.getText().toString();

    return value.toCharArray();;
}

并使用类似

android:text="@={viewModel.password}"

答案 1 :(得分:0)

这可能对我来说很好,也许在重新启动AS之后:

public class Converter {
    @InverseMethod("toCharArray")
    public static String toString(char [] value) {
        if(value == null) return "";
        return value.length == 0 ? "" : String.valueOf(value);
    }

    public static char [] toCharArray(String value) {
        if(value == null) return "".toCharArray();
        return value.isEmpty() ? "".toCharArray() : value.toCharArray();
    }
}