Точно определить Binding Adapter, который будет использоваться? - PullRequest
0 голосов
/ 22 февраля 2020

В Android отображение между атрибутами (например, android:text) и соответствующим адаптером привязки данных выполняется аннотацией адаптера привязки, содержащей то же имя атрибута (например, @BindingAdapter("android:text")).

Итак, если мне нужен адаптер привязки данных от Double до String, нужно ли использовать пользовательский атрибут или можно придерживаться android:text и дополнительно указать что-то вроде android:useCustomBindingAdapter="my.double.to.string.bindingadapter"?

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Я думаю, что вы можете создать stati c метод преобразования и обратный адаптер.

Создать методы в некотором файле / классе, например

@file:JvmName("DoubleToStringConverter")

package com.test.android

fun doubleToString(view: EditText, num: Double) = num.toString()

@InverseMethod("doubleToString")
fun textToDouble(view: EditText, value: CharSequence): Double { 
return value.toString().toDouble() } 

, а затем в макете

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

    <data>
        <import type="com.test.android.DoubleToStringConverter"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@={DoubleToStringConverter.doubleToString(your_viewmodel_live_data)}"
             />
</LinearLayout>
0 голосов
/ 22 февраля 2020

Если вы хотите связать двойной код, добавьте этот фрагмент кода:

@BindingAdapter("android:text")
fun bindToText(view: TextView, value: Double?) {
value?.let {
    view.text = value.toString()
    }
}

Если вы хотите поддерживать несколько типов:

@BindingAdapter("android:text")
fun bindToText(view: TextView, value: Any?) {
    value?.let {
        when (value) {
            is Double -> view.text = String.format(Locale.getDefault(), "%.2f", value)
            is Int -> view.text = value.toString()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...