2016-08-17 6 views
9

Integerデータ型での双方向バインディングの実装に問題があります。Integer型のAndroid双方向バインディングはデータバインディングが存在しません

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:

<?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> 

残念ながら、それは私にエラーを与える

"Error:(52, 17) Cannot find the getter for attribute 'android:text' with value type java.lang.Integer on android.support.design.widget.TextInputEditText. "

私は

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

に属性のテキストを変更する場合は、I GEエラーは

"Error:cannot generate view binders java.lang.NullPointerException"

ありがとうございます。

更新:上記のエラーの直後に別のエラーが発生したようです。

cannot generate view binders java.lang.NullPointerException

まだアプリがまだ起動していないにもかかわらず、なぜNPEになっているのかわかりません。

+0

'Integer'を' int'に切り替えると、 'String'から' int'などに自動的に変換される可能性があります。ハッキーなやり方は、年齢をStringとして格納してから変換することです。 – Vucko

+0

UserオブジェクトのIntegerをintに変更しましたが、引き続き同じエラーが発生しました。 – ank

+0

'Integer'を' ObservableInteger'に置き換えてみてください。あなたは '.set(SOMENUMBER)'メソッドを使う必要があります。参考までに[this post](http://stackoverflow.com/questions/37867988/android-data-binding-bindingconversion-failure-for-int-to-string)を参照してください。 'Integer.toString()'メソッドを使うのを忘れてしまいました – Rittel

答えて

9

どういうわけか私はBindingAdapterとInverseBindingAdapterを使ってこれを動作させました。

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

これが他の人にも役立つことを望みます。

+0

ねえ、この解決法はありがたいですが、私はまだ問題があります:EditTextで入力した文字はすべて、テキストの先頭にカーソルをリセットします。あなたは同じ問題を経験していますか?この問題の修正はありますか? –

+0

私は解決策を見つけました。新しいテキストは、 'view'のテキストが' @BindingAdapter(android:text ")'の 'value'と異なる場合にのみ設定してください。 –

2

前回の回答は、Roberto Leinardiのコメントと一緒に私にとって完璧に機能しました!半年後

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

まあ、多分私は誰かを助けることができる:私は追加する必要が がnullチェックがロベルトのチェックを行わなければならないということです。

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

OBS

あなたはこの単純なトリックを行うことができます。あなたは、少なくとものAndroid Studioの2.3

+0

私はこの解決策を見つけるために熱心に検索しなければならなかった。それははるかに簡単であり、上にあるべきです。この文書をどこで見つけることができますか? – xerotolerant

+0

申し訳ありません@xerotolerant あなたの意見や感想を教えてください: – Eduvm

+0

これは、例えばdoubleとintの値を同時に使用することができますか? –

1

はここに私の解決策である必要があります。それはきれいでシンプルです。単にレイアウトにStringが必要な場合は、intの代わりにStringを与えます。あなたがしなければならないことは、通常のセッターとゲッタが普通のことをやっている間に、setterとgetterをString型で作成し、それをUIにバインドするだけです!

完全なコード!

私のPOJOクラス(Mydata.java)。 getAgeStringおよびsetAgeStringは、変換を行うuiメソッドです。私がgetAgeString@Bindableを書いていることに注意してください。したがって、あなたは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 
     } 
    } 
} 

レイアウトファイル(activity_main.xml)を使用します。これは誰かに役立ちます@=との結合通常の2方法を使用しますが、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ファイル

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

希望するのではなく、ageStringを使用!

関連する問題