2016-06-16 15 views
18

Wystąpił tajemniczy problem podczas próby utworzenia @BindingConversion dla int do napisu.
następujący kod prace dla pływaków do strun:Wiązanie danych Androida @BindingConversion nie powiodło się dla int string

xml:

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

Kod:

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

i ustawienie:

viewModel.number.set(3.14f); 

Ale jeśli spróbuję tego samego dla ints do ciągów znaków Mam awarię.

public ObservableInt number = new ObservableInt(); 

z

viewModel.number.set(42); 

otrzymuję następujący:

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) 

Jakieś pomysły? Dzięki!

Odpowiedz

46

android:text z int zakłada, że ​​int jest identyfikatorem zasobu ciąg. Użyj android:text="@{Integer.toString(myViewModel.number)}".

+0

Aha! Dziękuję Ci! bym dane myślowe wiązania byłoby sprawdzić i przekształcić int zanim uderzył w widoku tekstu, ale najwyraźniej nie ~ Oznacza to, że powinniśmy być ostrożni, gdy za pomocą BindingConversion jeśli oryginalny typ może być błędnie interpretowane i stosowane bez uderzenia przetwornik. – Dave

+0

@Dave: "Wydaje mi się, że powiązanie danych sprawdzi i przekonwertuje int przed trafieniem w widok tekstowy" - nie, ponieważ ponieważ wszystkie powiązania danych wiedzą, to * dajesz * identyfikator ID łańcucha. "Oznacza to, że powinniśmy być ostrożni" - tak. :-) – CommonsWare

+4

Jak byś to zrobił, gdybyś chciał stworzyć 2-stronne wiązanie? – InfernalRapture

0

konwersja int na ciąg dla zestawu w TextView jak poniżej

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