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

时间:2016-06-16 19:36:33

标签: android data-binding android-databinding

尝试将int的@BindingConversion设为字符串时出现了一个神秘的问题 以下代码适用于浮点数到字符串

的xml:

func initilizeFetchedResultsController() {
    let moc = DatabaseController.sharedInstance.managedObjectContext
    let fetchRequest = NSFetchRequest()
    let entity = NSEntityDescription.entityForName("Coctail", inManagedObjectContext: moc)

    fetchRequest.entity = entity
    fetchRequest.fetchLimit = 10
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]

    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,
                                                               managedObjectContext: moc,
                                                               sectionNameKeyPath: nil,
                                                               cacheName: nil)
    aFetchedResultsController.delegate = self

    do {
        try aFetchedResultsController.performFetch()
    } catch {
        fatalError("\(error)")
    }
    fetchedResultsController = aFetchedResultsController
}

代码:

Authorization

并设置:

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

我得到以下内容:

 public ObservableInt number = new ObservableInt();

有什么想法吗? 谢谢!

6 个答案:

答案 0 :(得分:97)

带有android:text

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

您还需要导入Integer类:

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

   <!-- rest of layout goes here -->

</layout>

答案 1 :(得分:11)

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

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

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

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

   …

</layout>

答案 2 :(得分:5)

当心,此问题的所选答案已过期。

最新DataBinding,它不需要不需要导入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)}"

直接。

答案 3 :(得分:4)

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

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

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

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

另请参见this answer

答案 4 :(得分:0)

这对我有用

  <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 :(得分:0)

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

Integer.parseInt(string)

或字符串:

String.valueOf(string)