Android-Zwei-Wege-Bindung mit Integer-Typ verursacht Datenbindungen nicht vorhanden

Ich habe ein Problem mit der Implementierung von Zwei-Wege-Bindung mit einem Integer-Datentyp.

public class User { private String firstName; private String lastName; private int age; public User() {} public void setFirstName(String firstName) { this.firstName = firstName; } public String getFirstName() { return this.firstName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getLastName() { return this.lastName; } public void setAge(int age) { this.age = age; } public int getAge() { return this.age; } } 

XML:

  • Fügen Sie Animation zu einem ExpandableListView hinzu
  • Mit Android L Material Design auf KitKat
  • Erstellen von benutzerdefiniertem AlertDialog? Was ist die Wurzelansicht?
  • Wie funktioniert der native Android-Code für ARM auf x86?
  • Verschiedene Menüs für verschiedene Registerkarten in tab + swipe Anwendung für Android-Projekt
  • build.gradle und projekt libs
  •  <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data class="UserDataBinding"> <variable name="user" type="com.databinding.model.User" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="@dimen/activity_horizontal_margin"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@={user.firstName}" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@={user.lastName}" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@={user.age}" /> </LinearLayout> </layout> 

    Leider gibt es mir den Fehler

    "Fehler: (52, 17) Kann den Getter nicht für Attribut 'android: text' mit Wertstyp java.lang.Integer auf android.support.design.widget.TextInputEditText finden.

    Wenn ich den Attributtext ändere

      <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@={Integer.toString(user.age)}" /> 

    Dann bekomme ich den Fehler

    "Fehler: Kann keine Ansichtsmappen erzeugen java.lang.NullPointerException"

    Schätze jede mögliche Hilfe auf diesem.

    UPDATE: Es scheint, dass es einen anderen Fehler direkt nach dem oben genannten Fehler gab.

    Kann keine Ansichtsmappen erzeugen java.lang.NullPointerException

    Nicht sicher, warum es mir NPE gibt, obwohl die App noch nicht begonnen hat.

  • Mehrere Anfragen mit Nachrüstung, um Ergebnisse zu kombinieren
  • Rich Text in einer Textansicht
  • GdxRuntimeException auf Android: konnte keine freigegebene Bibliothek 'gdx' für Ziel laden
  • Unterschied zwischen armeabi und armeabi-v7a
  • Wird der Android-Anwendungskontext jemals zerstört?
  • Beschleunigung vom Koordinatensystem des Gerätes in absolutes Koordinatensystem
  • 4 Solutions collect form web for “Android-Zwei-Wege-Bindung mit Integer-Typ verursacht Datenbindungen nicht vorhanden”

    Irgendwie habe ich das mit BindingAdapter und InverseBindingAdapter bearbeitet.

     public class User { private String firstName; private String lastName; private int age; public User() {} public void setFirstName(String firstName) { this.firstName = firstName; } public String getFirstName() { return this.firstName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getLastName() { return this.lastName; } public void setAge(int age) { this.age = age; } public int getAge() { return this.age; } @BindingAdapter("android:text") public static void setText(TextView view, int value) { view.setText(Integer.toString(value)); } @InverseBindingAdapter(attribute = "android:text") public static int getText(TextView view) { return Integer.parseInt(view.getText().toString()); } } 

    Hoffentlich wird das auch jemand anderem helfen.

    Nun, sechs Monate später, aber vielleicht kann ich jemandem helfen.

    Du kannst diesen einfachen Trick machen:

     android:text="@={`` + mObject.someNumber}" 

    OBS : Du brauchst mindestens Android Studio 2.3

    Die vorherige Antwort, zusammen mit Roberto Leinardis Kommentar funktionierte perfekt für mich! Ich muss nur hinzufügen, dass ein null-check sollte getan werden, um Roberto's Scheck:

     @BindingAdapter("android:text") public static void setText(TextView view, int value) { view.setText(Integer.toString(value)); } @BindingAdapter("android:text") public static void setText(TextView view, int value) { if (view.getText() != null && ( !view.getText().toString().isEmpty() ) && Integer.parseInt(view.getText().toString()) != value) { view.setText(Integer.toString(value)); } } 

    Hier ist meine Lösung. Es ist sauber und einfach. Einfach, wenn das Layout String benötigt, gib ihm eine String statt int. Alles, was Sie tun müssen, ist, einen Setter und Getter mit String-Typ zu erstellen und sie zu verwenden, um an ui zu binden, während normaler Setter und Getter die normale Sache machen!

    Ein vollständiger Code!

    Meine POJO Klasse (Mydata.java). getAgeString und setAgeString sind die ui Methoden, die Umwandlung. Beachten Sie, dass ich @Bindable auf getAgeString . So ui wird ageString

     package com.databindingnumber; import android.databinding.BaseObservable; import android.databinding.Bindable; public class MyData extends BaseObservable{ private int age; public int getAge() { return age; } public void setAge(int age) { if(this.age != age) { this.age = age; notifyPropertyChanged(BR.ageString);//NOTE: ui is using ageString ! } } @Bindable public String getAgeString() { return Integer.toString(age); } public void setAgeString(String ageString) { try { int val = Integer.parseInt(ageString); this.setAge(val); }catch(NumberFormatException ex){ this.setAge(0);//default value } } } 

    Die Layoutdatei (activity_main.xml). Verwenden Sie die normale Zwei-Wege-Bindung mit @= aber verwenden Sie ageString anstelle des age

     <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="foo" type="com.databindingnumber.MyData"/> </data> <EditText android:layout_width="100dp" android:layout_height="wrap_content" android:inputType="numberSigned" android:text="@={foo.ageString}" /> </layout> 

    MainActivity.java Datei

     public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setFoo(new MyData()); } } 

    Hoffe, das wird jemandem helfen!

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.