DataBinding을 사용하여 Image 리소스를 ImageView로 설정하는 방법
안드로이드에서 어떻게 데이터 바인딩을 사용하여 이미지 리소스를 저장할 수 있습니까?ImageView
?
<ImageView
android:id="@+id/is_synced"
android:src="@{model.pending ? @mipmap/pending: @mipmap/synced}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
보류가 참이면 이미지를, 보류 중이면 다른 이미지를 원합니다.하지만 오류를 보이고 있습니다.어떻게 하면 이 기능을 달성할 수 있습니까?
나는 이것을 시도했고, 그것은 나에게 효과가 있습니다 (build도구 버전: 24.0.1):
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="8dp"
android:scaleType="centerInside"
app:imageResource="@{item.avatarResId}"/>
쓰임새만app:imageResource
대체할android:src
,android:src="@{item.avatarResId}"
다른 방법으로는 사용자 정의를 할 수 없습니다.@BindAdapter("android:src")
그 때문에
그러나 사용app:imageResource
정의할 필요가 없습니다.@BindAdapter
추가적으로, ImageView는 다음과 같은 방법을 가지고 있기 때문에setImageResource()
, 사용시app:imageResource
, 부를 것입니다setImageResource()
자동으로.
정답:
정의:
@BindingAdapter({"android:src"})
public static void setImageViewResource(ImageView imageView, int resource) {
imageView.setImageResource(resource);
}
용도:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:scaleType="center"
android:src="@{viewModel.imageRes, default=@drawable/guide_1}"/>
이미지를 이렇게 설정하고,
<ImageView
android:layout_width="28dp"
android:layout_height="28dp"
android:src="@{model.isActive ? @drawable/white_activated_icon :@drawable/activated_icon}"
tools:src="@mipmap/white_activated_icon" />
만약 당신이 논쟁을 방법에 전달하기를 원한다면, 당신은 다음과 같이.@IdRes
사용가능
XML:
<?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"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="<package_name>.R" />
</data>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:load_image="@{R.drawable.image}" />
</layout>
코드
@BindingAdapter("load_image")
public static void loadImage(ImageView view, @IdRes int imageId) {
//Logic
}
데이터 모델에 이미지의 리소스 ID가 포함되어 있는 경우 프로그래밍된 작업 없이 이 작업을 수행할 수 있습니다.
예:
<layout>
<data>
<import type="android.support.v4.content.ContextCompat" />
<variable
name="roomInfoItem"
type="com.example......model.RoomInfoModel" /> </data>
<RelativeLayout>
<ImageView
android:id="@+id/iv_room_info_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
</layout>
다음 행을 imageView에 추가하기만 하면 됩니다(코드를 추가할 때 포맷할 수 없었습니다)
android:src="@{ContextCompat.getDrawable(context,roomInfoItem.resId)}"
어디에resId
포함하다R.drawable.your_image_name
이 위대한 기사에 따르면: Data Binding과 Picasso로 이미지 로드
두 가지 방법이 있습니다.
- 사용.
@BindingAdapter
ObservableField
& 사용자 지정 피카소 대상
Android Developers reference Data Binding Guide(안드로이드 개발자 참조 데이터 바인딩 가이드)에서는 첫 번째 것만 찾을 수 있습니다.
두 기사 다 읽어주세요.
자세한 정보:
- http://www.mutualmobile.com/posts/using-data-binding-api-in-recyclerview
- https://blog.stylingandroid.com/data-binding-part-3/
도움이 되길 바랍니다.
자세한 내용은 여기참조 상세 데이터 바인딩 및 피카소 이미지 로드
public class ProfileViewModel {
// The URL will usually come from a model (i.e Profile)
static final String IMAGE_URL = "http://cdn.meme.am/instances/60677654.jpg";
public ObservableField<Drawable> profileImage;
private BindableFieldTarget bindableFieldTarget;
public ProfileViewModel(Context context) {
profileImage = new ObservableField<>();
// Picasso keeps a weak reference to the target so it needs to be stored in a field
bindableFieldTarget = new BindableFieldTarget(profileImage, context.getResources());
Picasso.with(context)
.load(IMAGE_URL)
.placeholder(R.drawable.placeholder)
.into(bindableFieldTarget);
}
public class BindableFieldTarget implements Target {
private ObservableField<Drawable> observableField;
private Resources resources;
public BindableFieldTarget(ObservableField<Drawable> observableField, Resources resources) {
this.observableField = observableField;
this.resources = resources;
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
observableField.set(new BitmapDrawable(resources, bitmap));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
observableField.set(errorDrawable);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
observableField.set(placeHolderDrawable);
}
}
}
문제는 이름이 같은 setter를 가진 setter를 가지고 있는 모든 특성에서 발생합니다. 예를 들어, 만약 우리가 ImageView에서 setSrc() 메서드를 사용했다면 당신의 코드는 사용자 정의 바인딩 어댑터 없이 작동했을 것입니다.
<ImageView ...
app:svg="@{@drawable/ic_car_placeholder}" />
그리고나서
@BindingAdapter({"app:svg"})
public static void setImageViewResource(ImageView imageView, Drawable resource) {
imageView.setBackgroundDrawable(resource);
}
언급URL : https://stackoverflow.com/questions/34607028/how-to-set-image-resource-to-imageview-using-databinding
'programing' 카테고리의 다른 글
워드프레스에서 CJK와 영어 문자를 모두 포함하는 선을 제대로 끊는 방법은? (0) | 2023.10.26 |
---|---|
약속을 예약하기 위해 빠르고 최적화된 데이터베이스 쿼리 (0) | 2023.10.26 |
도커 컴포지트.yml에서 도커 컨테이너를 리빌드하는 방법은? (0) | 2023.10.26 |
DDD(Data Display Debugger)의 좋은 유닉스 대안은 무엇입니까? (0) | 2023.10.21 |
로컬, 전역, 정적, 자동, 레지스터, 외부, 상수 및 휘발성 변수는 어디에 저장됩니까? (0) | 2023.10.21 |