【问题标题】:Android Data Binding @BindingConversion failure for int to stringAndroid数据绑定@BindingConversion失败,用于int到字符串
【发布时间】:2016-10-18 11:45:47
【问题描述】:

在尝试将 @BindingConversion 用于 int 转换为字符串时遇到了一个神秘问题。
以下代码适用于字符串的浮点数

xml:

...
<variable
        name="myViewModel"
        type="... .SomeModel" />
...
<TextView
            style="@style/StyleStuff"
            android:text="@{myViewModel.number}" />

代码:

public class SomeModel {
    public ObservableFloat number = new ObservableFloat();
}

和设置:

viewModel.number.set(3.14f);

但如果我对 ints to strings 尝试相同的操作,我会崩溃。

 public ObservableInt number = new ObservableInt();

viewModel.number.set(42);

我得到以下信息:

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)

有什么想法吗? 谢谢!

【问题讨论】:

    标签: android data-binding android-databinding


    【解决方案1】:

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

    您还需要导入Integer 类:(不再需要)

    【讨论】:

    • 啊哈!谢谢!我原以为数据绑定会在 int 到达文本视图之前检查并转换它,但显然不是~这意味着我们在使用 BindingConversion 时应该小心,如果原始类型可能被误解并在没有点击转换器的情况下使用。跨度>
    • @Dave:“我原以为数据绑定会在 int 到达文本视图之前检查并转换它”——不,因为所有数据绑定都知道,你是 i> 给它一个字符串资源 ID。 “这意味着我们应该小心”——是的。 :-)
    • 如果您想创建 2 路绑定,您会怎么做?
    • @InfernalRapture:可能是@InverseBindingAdapter,虽然我还没玩过。
    【解决方案2】:

    将 int 转换为字符串以便在 TextView 中设置,如下所示:

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

    另外,String 类必须由布局导入:

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

    【讨论】:

      【解决方案3】:

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

      android:text="@{`` + model.intValue}"
      

      这也可以在two-way binding 中用于EditText。其中用户输入在模型中设置为 Integer 值,并显示为String

      android:text="@={`` + model.intValue}"
      

      另见this answer

      【讨论】:

        【解决方案4】:

        这对我有用

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

        带有逆方法的转换器类

        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);
        }}
        

        【讨论】:

        • 这太过分了!
        • 您可以为此使用绑定适配器。
        【解决方案5】:

        小心,在最新的DataBinding (2019) 中,确实需要导入IntegerString 否则你会得到这个错误:

        ****/ data binding error ****msg:Missing import expression although it is registered file
        

        official doc 说:java.lang.* is imported automatically.

        随便去

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

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

        直接。

        【讨论】:

        • 这应该被赞成,今天数据绑定不需要导入java.lang.Stringjava.lang.Integer来进行转换。
        【解决方案6】:

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

        Integer.parseInt(string)
        

        或通过:

        String.valueOf(string)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多