Как создать пользовательскую привязку данных в Android? (android studio)
Я хочу реализовать пользовательские функции для загрузки изображения из ImageView
такой app:imageUrl="@{status.imageUrl}"
в приведенном ниже коде:
<?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
.
2 ответов
для этой работы вам нужно lib, как 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);
}
}
на BindingCustom
класса loadImage
метод для загрузки изображения с URL-адреса вашим заинтересованным способом, но я использую Пикассо библиотека, потому что это общий lib для этой работы, и вы можете изменить его на свои коды.
ниже-это то, что я предпочитаю:
сначала сделайте пользовательский вид расширенной формы класса
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
}
}
второй объявить styleable в папке res
<declare-styleable name="MyImageView">
<attr name="imageUrl" format="string"/>
</declare-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"/>