Android数据绑定@BindingConversion失败,int为string

Dav*_*ave 39 data-binding android android-databinding

尝试为int创建一个@BindingConversion时遇到一个神秘的问题.
以下代码适用于浮点数到字符串:

XML:

...
<variable
        name="myViewModel"
        type="... .SomeModel" />
...
<TextView
            style="@style/StyleStuff"
            android:text="@{myViewModel.number}" />
Run Code Online (Sandbox Code Playgroud)

码:

public class SomeModel {
    public ObservableFloat number = new ObservableFloat();
}
Run Code Online (Sandbox Code Playgroud)

和设置:

viewModel.number.set(3.14f);
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试对字符串进行同样的操作,我会崩溃.

 public ObservableInt number = new ObservableInt();
Run Code Online (Sandbox Code Playgroud)

viewModel.number.set(42);
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

FATAL EXCEPTION: main
Process: ...myapplication, PID: 14311
android.content.res.Resources$NotFoundException: String resource ID #0xfa0
    at android.content.res.Resources.getText(Resources.java:1123)
    at android.support.v7.widget.ResourcesWrapper.getText(ResourcesWrapper.java:52)
    at android.widget.TextView.setText(TextView.java:4816)
    at ...executeBindings(ActivityAdaptersBinding.java:336)
    at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:355)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢!

Com*_*are 120

android:textint假定int是一个字符串资源ID.使用android:text="@{Integer.toString(myViewModel.number)}".

您还需要导入Integer该类:

__PRE__

  • 如果你想创建双向绑定,你会怎么做? (5认同)

Mar*_*jad 15

在文本视图中将int转换为字符串,如下所示:

android:text="@{String.valueOf(myViewModel.number)}"
Run Code Online (Sandbox Code Playgroud)

此外,String必须通过布局导入类:

<layout>
   <data>
      <import type="java.lang.String" />
   </data>

   …

</layout>
Run Code Online (Sandbox Code Playgroud)


Wes*_*ely 15

当心,在最新的DataBinding(2019),它要求进口IntegerString 或者你会得到这样的错误:

****/ data binding error ****msg:Missing import expression although it is registered file
Run Code Online (Sandbox Code Playgroud)

官方文件说:java.lang.* is imported automatically.

随便走

android:text="@{Integer.toString(myViewModel.number)}" 要么

android:text="@{String.valueOf(myViewModel.number)}"

直。


Khe*_*raj 10

最简单的解决方案可能是对某人有所帮助。

android:text="@{`` + model.intValue}"
Run Code Online (Sandbox Code Playgroud)

这可以用在双向绑定EditText也。用户输入的位置设置为模型中的Integer值,并显示为String

android:text="@={`` + model.intValue}"
Run Code Online (Sandbox Code Playgroud)

另请参阅此答案


Hos*_*ian 7

为时已晚,但我为新手更新它。您可以使用以下方法解析 xml 中的 int:

Integer.parseInt(string)
Run Code Online (Sandbox Code Playgroud)

或字符串:

String.valueOf(string)
Run Code Online (Sandbox Code Playgroud)


sha*_*een 5

这对我有用

  <TextView
        android:id="@+id/number"
        android:text='@={Converter.convertIntToString(myViewModel.number)}'

        />
Run Code Online (Sandbox Code Playgroud)

具有逆方法的转换器类

public class Converter {


public static int convertStringToInt(String text) {
   return Integer.parseInt(text);
}

@InverseMethod(value="convertStringToInt")
public static String convertIntToString(int value) {
    return Integer.toString(value);
}}
Run Code Online (Sandbox Code Playgroud)

  • 这太过分了! (4认同)