2016-02-28 12 views
9
私は以下のコードでこの app:imageUrl="@{status.imageUrl}"よう ImageViewから画像をダウンロードするには、カスタム関数を実装する

アンドロイドでカスタムデータバインディングを作成する方法は? (アンドロイドスタジオ)

<?xml version="1.0" encoding="utf-8"?> 
    <layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 

     <data> 
     <variable 
      name="status" 
      type="com.databinding.data.Status" /> 

     </data> 

     <RelativeLayout 
     android:id="@+id/status_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <ImageView 
      android:id="@+id/status_avatar" 
      android:layout_width="64dp" 
      android:layout_height="64dp" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_alignParentTop="true" 
      android:contentDescription="@null" 
      app:imageUrl="@{status.imageUrl}"/> 

     </RelativeLayout> 
    </layout> 

どのように画像が@{status.imageUrl}から自動ダウンロードすることができ、この関数を記述するために? このライブラリを使用してくださいcom.android.databinding

答えて

4

この作業では、android databinding libのようなライブラリが必要です。このライブラリで
、最初のプロジェクトのbuild.gradleにスクリプトの下に追加します。

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.5.0' 
     classpath 'com.android.databinding:dataBinder:1.0-rc4' 
    } 
} 

とモジュールファイルのbuild.gradleトップにこのコードを追加します。

apply plugin: 'com.android.databinding' 

そして、例えば、あなたのクラスを作成します:class BindingCustomをし、このコードを書いてください

public class BindingCustom { 

    @BindingAdapter({"imageUrl"}) 
    public static void loadImage(final ImageView view, String url) { 

     Picasso.with(view.getContext()).load(url).into(view); 

    } 
} 

loadImageあなたの興味のある方法でURLから画像をダウンロードする方法ですが、Picassoライブラリを使用しています。これはこのジョブの共通のライブラリであり、コードに変更することができます。以下

This is a helpful link for more information

2

私が好むものです:

最初のカスタムクラスの拡張フォームのイメージ図

import android.annotation.TargetApi; 
import android.content.Context; 
import android.os.Build; 
import android.util.AttributeSet; 
import android.widget.ImageView; 

public class MyImageView extends ImageView { 
    public MyImageView(Context context) { 
     super(context); 
     downloader(null); 
    } 

    public MyImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     downloader(attrs); 
    } 

    public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     downloader(attrs); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public MyImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     downloader(attrs); 
    } 

    private void downloder(AttributeSet attr){ 
    // TAKE THE LINK AND DOWNLOAD IMAGE HERE 
    } 
} 

が第二あなたのresフォルダ

<declare-styleable name="MyImageView"> 
    <attr name="imageUrl" format="string"/> 
</declare-styleable> 

でstyleableを宣言します最後に私たちのダウンローダ機能を作ることができます

private void downloader(AttributeSet attrs) { 
    if (attrs!=null) { 
     TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MyImageView); 
     String url = a.getString(R.styleable.MyImageView_imageUrl); 
     // First check whether we have such a property then 
     // DOWNLOAD IT WITH ANY LIBRARY YOU LIKE 
     // in this case i used IMAGE LOADER 
     if(url!=null) 
      ImageLoader.getInstance().displayImage(url,this); 
    } 
} 

は今、あなたは簡単にXMLのリンクを追加することができます

<com.raianraika.example.MyImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:imageUrl="www.google.com"/> 
関連する問題