2017-05-23 7 views
2

ボタンとアイコンがあります。データバインディングを使用してButtonのdrawableLeft画像をロード

enter image description here

これは、このコードで実現されています

  <Button 
       ... 
       android:drawableLeft="@drawable/ghana" 
       android:drawableStart="@drawable/ghana" 
       android:text="@string/hint_ghana" 

       /> 

データバインディングは、テキストで動作しますが、私はこれを行うと、アイコンではない:

  <Button 
       ... 
       android:drawableLeft="@{countryOfResidence.thumbnail}" 
       android:drawableStart="@{countryOfResidence.thumbnail}" 
       android:text="@{countryOfResidence.countryName}" 

       /> 

をこれが結果です。

enter image description here

私はこれに対する解決策を探しましたが、画像をImageViewに読み込むことに集中しているものはほとんど見つかりませんでした。

マイ・モデル・クラスは次のようになります。呼び出し元の活動のonCreate()方法で

public class CountryOfResidence { 

private String countryName; 
private int thumbnail; 


public CountryOfResidence(String countryName, int thumbnail) { 
    this.setCountryName(countryName); 
    this.setThumbnail(thumbnail); 
} 
.... 

、この

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ActivitySignUpBinding signUpBinding = DataBindingUtil.setContentView(this, R.layout.activity_sign_up); 
    MyHandler myHandler = new MyHandler(); 
    signUpBinding.setMyHandler(myHandler); 

    mViewFlipper = (ViewFlipper) findViewById(R.id.signUpViewFlipper); 

    countryOfResidenceList = new ArrayList<>(); 
    countryOfResidenceList.add(new CountryOfResidence("Nigeria", R.drawable.nigeria)); 
    countryOfResidenceList.add(new CountryOfResidence("Ghana", R.drawable.ghana)); 
    countryOfResidenceList.add(new CountryOfResidence("Kenya", R.drawable.kenya)); 

    signUpBinding.setCountryOfResidence(countryOfResidenceList.get(1)); 

をやっていることは最後に、私のレイアウトでデータタグはこの

のように見えます
<data> 

    ... 
    <variable 
     name="countryOfResidence" 
     type="orem_tech.com.teylur.model.CountryOfResidence"/> 
</data> 

アドバイスはありますか?

答えて

3

Drawableの代わりにandroid:drawableLeft属性にリソースIDを渡しているようです。デフォルトでは、アンドロイドデータバインディングは、色があるとみなして自動的に整数をColorDrawableに変換します。

これを解決する方法はいくつかあります。

public Drawable loadDrawable(Context context, int resourceId) { 
    return context.getDrawable(resourceId); 
} 

し、このようにそれをバインドします:最初は、メソッドを追加することです

android:drawableLeft="@{MyUtil.loadDrawable(countryOfResidence.thumbnail)}" 

あなたはまた、代わりにintthumbnailDrawableを作ることができる:

public final ObservableField<Drawable> thumbnail = new ObservableField<Drawable>(); 

あなたは可能性がありまた、独自のBindingAdapterを作成してint引数を受け入れます。 TextViewBindingAdapterの例に従ってください:あなたは上記の操作を行う場合は

@BindingAdapter({"android:drawableLeft"}) 
public static void setDrawableLeft(TextView view, int resourceId) { 
    Drawable drawable = textView.getContext().getDrawable(resourceId); 
    setIntrinsicBounds(drawable); 
    Drawable[] drawables = view.getCompoundDrawables(); 
    view.setCompoundDrawables(drawable, drawables[1], drawables[2], drawables[3]); 
} 

private static void setIntrinsicBounds(Drawable drawable) { 
    if (drawable != null) { 
     drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
    } 
} 

は、あなたが描画可能として、整数の色を設定するには、データバインディングを使用することはできません。それを分離したい場合は、別の(app namespace)属性を使うことができます。しかし、とにかくカラードロウアブルをdrawableLeftと設定する必要はないでしょう。

+0

優秀な説明、ありがとうございます。 –

関連する問題