2016-02-28 13 views
9

Chcę realizować funkcje niestandardowe, aby pobrać obraz z ImageView jak ten app:imageUrl="@{status.imageUrl}" w poniższym kodzie:Jak utworzyć niestandardowe powiązanie danych w systemie Android? (Android studio)

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

Jak napisać tej funkcji, które można pobrać obraz z @{status.imageUrl} zautomatyzować? Użyj tej biblioteki com.android.databinding.

Odpowiedz

4

Do tej pracy potrzebujesz biblioteki takiej jak android databinding lib.
W tej biblioteki, należy najpierw dodać poniżej skryptów build.gradle projektu:

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

i dodać kody do top build.gradle pliku modułu:

apply plugin: 'com.android.databinding' 

I utworzyć klasę na przykład: class BindingCustom i napisz następujące kody:

public class BindingCustom { 

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

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

    } 
} 

W klasie BindingCustom masz loadImage Metoda pobierania obrazu z adresu URL w interesujący sposób, ale korzystam z biblioteki Picasso, ponieważ jest to zwykła biblioteka dla tego zadania i można ją zmienić na kody.

This is a helpful link for more information

2

poniżej jest to, co wolą:

najpierw dokonać przedłużony zwyczaj klasa widoku formularza obraz

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

2-cie zadeklarować styleable w folderze res

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

nareszcie pozwala tworzyć funkcję downloadera

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

teraz można łatwo dodać link w xml

<com.raianraika.example.MyImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:imageUrl="www.google.com"/>