অ্যান্ড্রয়েডে অঙ্কনযোগ্য সংস্থান আইডি সেট করুন: অ্যান্ড্রয়েডে ডেটা বন্ডিং ব্যবহার করে ইমেজভিউয়ের জন্য এসসিআর


91

আমি অঙ্কনযোগ্য সংস্থান আইডিটি অ্যান্ড্রয়েডে সেট করতে চেষ্টা করছি: ডেটা বন্ডিং ব্যবহার করে ইমেজভিউয়ের এসআরসি

এখানে আমার উদ্দেশ্য:

public class Recipe implements Parcelable {
    public final int imageResource; // resource ID (e.g. R.drawable.some_image)
    public final String title;
    // ...

    public Recipe(int imageResource, String title /* ... */) {
        this.imageResource = imageResource;
        this.title = title;
    }

    // ...
}

আমার লেআউটটি এখানে:

<?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="recipe"
            type="com.example.android.fivewaystocookeggs.Recipe" />
    </data>

    <!-- ... -->

    <ImageView
        android:id="@+id/recipe_image_view"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:scaleType="centerCrop"
        android:src="@{recipe.imageResource}" />

    <!-- ... -->

</layout>

এবং পরিশেষে, ক্রিয়াকলাপ শ্রেণি:

// ...

public class RecipeActivity extends AppCompatActivity {

    public static final String RECIPE_PARCELABLE = "recipe_parcelable";
    private Recipe mRecipe;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mRecipe = getIntent().getParcelableExtra(RECIPE_PARCELABLE);
        ActivityRecipeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_recipe);
        binding.setRecipe(mRecipe);
    }

    // ...

}

এটি চিত্রটি মোটেও প্রদর্শন করে না। আমি কি ভুল করছি?

বিটিডাব্লু, এটি পুরোপুরি স্ট্যান্ডার্ড পদ্ধতিতে কাজ করছিল:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recipe);

    final ImageView recipeImageView = (ImageView) findViewById(R.id.recipe_image_view);
    recipeImageView.setImageResource(mRecipe.imageResource);

}

উত্তর:


112

নভেম্বর 10, 2016 হিসাবে উত্তর দিন

নীচে স্প্ল্যাশের মন্তব্যটি হাইলাইট করেছে যে কোনও কাস্টম সম্পত্তি (যেমন imageResource) ব্যবহার করার প্রয়োজন নেই , আমরা পরিবর্তে এর জন্য একাধিক পদ্ধতি তৈরি করতে পারি android:src:

public class DataBindingAdapters {

    @BindingAdapter("android:src")
    public static void setImageUri(ImageView view, String imageUri) {
        if (imageUri == null) {
            view.setImageURI(null);
        } else {
            view.setImageURI(Uri.parse(imageUri));
        }
    }

    @BindingAdapter("android:src")
    public static void setImageUri(ImageView view, Uri imageUri) {
        view.setImageURI(imageUri);
    }

    @BindingAdapter("android:src")
    public static void setImageDrawable(ImageView view, Drawable drawable) {
        view.setImageDrawable(drawable);
    }

    @BindingAdapter("android:src")
    public static void setImageResource(ImageView imageView, int resource){
        imageView.setImageResource(resource);
    }
}

পুরানো উত্তর

আপনি সবসময় একটি অ্যাডাপ্টার ব্যবহার করার চেষ্টা করতে পারেন:

public class DataBindingAdapters {

    @BindingAdapter("imageResource")
    public static void setImageResource(ImageView imageView, int resource){
        imageView.setImageResource(resource);
    }
}

তারপরে আপনি নিজের এক্সএমএলে অ্যাডাপ্টারটি ব্যবহার করতে পারেন

<ImageView
    android:id="@+id/recipe_image_view"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:scaleType="centerCrop"
    imageResource="@{recipe.imageResource}" />

নিশ্চিত হয়ে নিন যে এক্সএমএলের মধ্যে থাকা নামটি বাইন্ডিংএডাপ্টার টীকাটির সাথে মেলে (চিত্রের উত্স)

বিশেষ করে কোথাও ডেটাবাইন্ডিং অ্যাডাপ্টারস ক্লাস ঘোষণার দরকার নেই, ডাটাবাইন্ডিং মেকানিকরা এটিকে কোনও ব্যাপার মনে করবে না (আমি বিশ্বাস করি)


এটি ব্যবহার করে কাজ করে @BindingAdapter। কিন্তু মান হওয়া উচিত android:src, না imageResource: @BindingAdapter("android:src")। ধন্যবাদ!
ইউরি সেরেডিয়ুক

4
নিবন্ধন করুন হা হা প্লিজ আপনার জুড়ে: "SRC Android" XML মধ্যে যে এরকম প্রতিটি একক ব্যবহারের ওভাররাইড করবে সমগ্র আবেদন আপনি স্পষ্টভাবে না কাজ করা চাই। কাজ করার জন্য ইমেজ রিসোর্স পেতে আপনাকে চিত্রটির জন্য এক্সএমএল পরিবর্তন করতে হবে যেমন আমি উপরে করেছি, ডেটাবাইন্ডিং সেখানে কী রাখবে তা কার্যকর করবে
জো মাহের

4
ঠিক আছে, আমি ধারণা বুঝতে পেরেছি। এখন ব্যবহার <ImageView imageResource="@{recipe.imageResource}" />এবং @BindingAdapter("imageResource")। আমি imageResource="@{recipe.imageResource}"আপনার কোডটি
স্নিপড

4
এটির কি দরকার নেই app:imageResource?
নেমস্পেস

4
"এটি করার ফলে আপনার পুরো অ্যাপ্লিকেশন জুড়ে" অ্যান্ড্রয়েড: এসসিআর "এক্সএমএল-এর প্রতিটি একক ব্যবহারকে ওভাররাইড করবে" ডেটাবাইন্ডিং কি কেবলমাত্র চিত্রকল্পে এই বৈশিষ্ট্যটি প্রয়োগ করতে যথেষ্ট স্মার্ট নয়, কারণ এটি ফাংশনে সংজ্ঞায়িত কী? আমি মনে করি "অ্যান্ড্রয়েড: এসসিআর" পছন্দনীয় হবে .... বিবেচনা করুন Android অ্যান্ড্রয়েড নিজেই ইমেজভিউ বাইন্ডিং অ্যাডাপ্টারের জন্য কী করে: অ্যান্ড্রয়েড.googles Source.com/platform/frameworks/data-binding/+/…
স্প্ল্যাশ

41

কোনও রীতিনীতি দরকার নেই BindingAdapter। শুধু ব্যবহার

app:imageResource="@{yourResId}"

এবং এটা ঠিক কাজ করবে।

পরীক্ষা করে দেখুন এই কিভাবে এটি কাজ করে না।



অবশ্যই, সেরা এবং সর্বাধিক সহজ উত্তর
ভাগ্যবান হ্যান্ডলার

এটি 2020 সালের শেষের দিক থেকে সেরা এবং সবচেয়ে উপযুক্ত উত্তরের মতো দেখায়
এমসি

আমি ImageViewক্লাসটি একবার দেখে নিচ্ছি এবং setImageResourceপদ্ধতিটি অনুসরণ করছি , মনে হচ্ছে অবশেষে এটি সমাধান হয়ে গেছে resolveUriএবং শূন্যের বৈধতা না থাকলে রয়েছে। সুতরাং Intযদি আমি ভাবছি যে কি হতে পারে জন্য কাজ করবে Int?। যখন বাইন্ডিংগুলি কার্যকর করা হয়, উদাহরণস্বরূপ, যদি অন্য কোনও কল হয় executePendingBindingsতবে শনাক্তযোগ্য নয় শূন্যের চেয়ে শূন্য হয়, নাল থেকে নাল হয়।
কুটিকো

25

সংজ্ঞায়িত:

@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}"/>

আমি কোথায় এই পদ্ধতিটি যুক্ত করব
myatmins

সমর্থন এটি কোনও শ্রেণিতে যুক্ত করুন, সম্ভবত আপনি একটি চিত্রডাটাবাইন্ডিংএডাপ্টার.ক্লাস তৈরি করতে পারেন।
কিন্মিয়াও

12

আপনি যখন নিজের তৈরি করবেন তখন কখনও কখনও স্ট্যান্ডার্ড এসডিকে বৈশিষ্ট্যগুলিকে ওভাররাইড করবেন না @BindingAdapter!

এটি অনেক কারণের জন্য এটির মতো ভাল পদ্ধতির নয়: এটি অ্যানড্রয়েড এসডিকে আপডেটে নতুন বৈশিষ্ট্যগুলির সুবিধা পেতে বাধা দিতে পারে that এছাড়াও এটি বিকাশকারীদের বিভ্রান্ত করতে পারে এবং অবশ্যই পুনরায় ব্যবহারযোগ্যতার জন্য জটিল (কারণ এটি ওভাররাইড করা অপ্রচলিত)

আপনি বিভিন্ন নাম স্থান যেমন ব্যবহার করতে পারেন:

custom:src="@{recipe.imageResource}"

বা

mybind:src="@{recipe.imageResource}"

------ আপডেট শুরু করুন ২ জুলাই ২০১৮

নেমস্পেস ব্যবহার করার পরামর্শ দেওয়া হয় না, সুতরাং উপসর্গ বা বিভিন্ন নামের উপর নির্ভর করা ভাল:

app:custom_src="@{recipe.imageResource}"

বা

app:customSrc="@{recipe.imageResource}"

------ শেষ আপডেট ২ জুলাই ২০১৮

তবে, আমি বিভিন্ন সমাধানের সুপারিশ করব:

android:src="@{ContextCompat.getDrawable(context, recipe.imageResource)}"

আবদ্ধ অভিব্যক্তির ভিতরে প্রসঙ্গের ভিউ সর্বদা উপলব্ধ @{ ... }


4
আমি মনে করি যে এক্সএমএল এর ভিতরে কোডটি যথাসম্ভব এড়ানো উচিত - এটি পরীক্ষামূলক নয়, এটি গাদা করতে পারে এবং এটি সুস্পষ্ট নয়। তবে আমি সম্মত হই যে ওভারলোডিং স্ট্যান্ডার্ড বৈশিষ্ট্যগুলি বিভ্রান্তিকর হতে পারে। আমি মনে করি সর্বোত্তম উপায় হ'ল নতুন বৈশিষ্ট্যটির আলাদাভাবে নামকরণ করা, এই ক্ষেত্রে "srcResId", তবে এখনও একটি বাইন্ডিংএডাপ্টার ব্যবহার করুন
কিরিল স্টারোস্টিন

7

মাহের আবুত্রার উত্তরের ভিত্তিতে এক্সএমএলটি ব্যবহার করে এটি শেষ করেছি:

android:src="@{context.getDrawable(recipe.imageResource)}"

contextপরিবর্তনশীল উপলব্ধ কোনো আমদানির ছাড়া অভিব্যক্তি বাঁধাই হবে। এছাড়াও, কোন কাস্টম BindingAdapterপ্রয়োজন। কেবলমাত্র সতর্কতামূলক: পদ্ধতিটি getDrawableকেবলমাত্র 21 21-র পরে উপলব্ধ।


6

জন্য Kotlin একটি শীর্ষ স্তরের utils ফাইলে এই করা, কোন স্ট্যাটিক / সহচর প্রসঙ্গ প্রয়োজন:

@BindingAdapter("android:src")
fun setImageViewResource(view: ImageView, resId : Int) {
    view.setImageResource(resId)
}

5

আপনি আরও করতে পারেন DataBindingAdapter

এই প্রকারের যে কোনও সেট করুন:

android:src="@{model.profileImage}"

android:src="@{roundIcon ? @drawable/ic_launcher_round : @drawable/ic_launcher_round}"

android:src="@{bitmap}"

android:src="@{model.drawableId}"

android:src="@{@drawable/ic_launcher}"

android:src="@{file}"

android:src="@{`https://placekitten.com/200/200`}"

ত্রুটি চিত্র / স্থানধারক চিত্র সেট করুন

placeholderImage="@{@drawable/img_placeholder}"
errorImage="@{@drawable/img_error}"


<ImageView
    placeholderImage="@{@drawable/ic_launcher}"
    errorImage="@{@drawable/ic_launcher}"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:src="@{`https://placekitten.com/2000/2000`}"
    />

সব ধরণের পরীক্ষিত

এসসি

সুতরাং এটি একক বাঁধাই অ্যাডাপ্টারের মাধ্যমে সম্ভব হয়ে ওঠে। এই পদ্ধতির প্রকল্পটি কেবল অনুলিপি করুন।

public class BindingAdapters {
    @BindingAdapter(value = {"android:src", "placeholderImage", "errorImage"}, requireAll = false)
    public static void loadImageWithGlide(ImageView imageView, Object obj, Object placeholder, Object errorImage) {
        RequestOptions options = new RequestOptions();
        if (placeholder instanceof Drawable) options.placeholder((Drawable) placeholder);
        if (placeholder instanceof Integer) options.placeholder((Integer) placeholder);

        if (errorImage instanceof Drawable) options.error((Drawable) errorImage);
        if (errorImage instanceof Integer) options.error((Integer) errorImage);

        RequestManager manager = Glide.with(App.getInstance()).
                applyDefaultRequestOptions(options);
        RequestBuilder<Drawable> builder;

        if (obj instanceof String) {
            builder = manager.load((String) obj);
        } else if (obj instanceof Uri)
            builder = manager.load((Uri) obj);
        else if (obj instanceof Drawable)
            builder = manager.load((Drawable) obj);
        else if (obj instanceof Bitmap)
            builder = manager.load((Bitmap) obj);
        else if (obj instanceof Integer)
            builder = manager.load((Integer) obj);
        else if (obj instanceof File)
            builder = manager.load((File) obj);
        else if (obj instanceof Byte[])
            builder = manager.load((Byte[]) obj);
        else builder = manager.load(obj);
        builder.into(imageView);
    }
}

কারণ আমি সমস্ত বস্তু লোড করতে গ্লাইড ব্যবহার করেছি

আপনি যদি আমাকে জিজ্ঞাসা করেন আমি কেন অঙ্কনযোগ্য / সংস্থান আইডি লোড করতে গ্লাইড ব্যবহার করেছি, পরিবর্তে আমি ব্যবহার করতে পারি imageView.setImageBitmap();বা imageView.setImageResource();। সুতরাং কারণ যে

  • গ্লাইড একটি দক্ষ চিত্র লোডিং ফ্রেমওয়ার্ক যা মিডিয়া ডিকোডিং, মেমরি এবং ডিস্ক ক্যাশে মোড়ানো ps সুতরাং আপনার বড় আকারের চিত্র এবং ক্যাশে সম্পর্কে চিন্তা করার দরকার নেই।
  • চিত্রটি লোড করার সময় ধারাবাহিকতা তৈরি করতে। এখন সমস্ত ধরণের চিত্রের সংস্থানগুলি গ্লাইড দ্বারা লোড করা হয়।

আপনি যদি পিকাসো, ফ্রেসো বা অন্য কোনও চিত্র লোডিং লাইব্রেরি ব্যবহার করেন তবে আপনি loadImageWithGlideপদ্ধতিতে পরিবর্তন আনতে পারেন


`ত্রুটি-ইমেজ =" @ {@ অঙ্কনযোগ্য / আইসি_লাঞ্চার} "` ` এই জিনিসটি আমার জন্যও সংকলন করে না
বিবেক মিশ্র

@ বিবেকমিশ্রা সম্ভবত আপনার আইসি_লানচারটি মাইপম্যাপে আছে ?, চেষ্টা করুন @ মিপম্যাপ / আইসি_লানচার।
খেমরাজ 10

আপনি কি আপনার প্রাসঙ্গিক ত্রুটি লগ পেস্ট করতে পারেন? আপনি কি আপনার বাধ্যবাধকতা ব্যবহারের ক্লাসে এই পদ্ধতিটি যুক্ত করেছেন?
খেমরাজ

**** / ডেটা বাঁধন ত্রুটি **** #: com.zuowei.circleimageview.CircIImaView এ মান প্রকার java.lang. স্ট্রিং সহ 'অ্যাপ্লিকেশন: src' বৈশিষ্ট্যটির জন্য প্রাপ্তকারী খুঁজে পাওয়া যায় না ircle আমি অ্যান্ড্রয়েড পাশাপাশি অ্যাপ নেমস্পেস উভয় দিয়ে চেষ্টা করেছি এবং দুজনেই আমার পক্ষে কাজ করে নি। আমি প্যারামিটারে সার্কিট ইমেজভিউয়ের সাথে ডিফল্ট চিত্রদর্শনটিও প্রতিস্থাপন করেছি
বিবেক মিশ্র

এছাড়াও আমি একটি পৃথক শ্রেণিতে বাইন্ডিং অ্যাডাপ্টার তৈরি করেছি
বিবেক মিশ্র

3
public Drawable getImageRes() {
        return mContext.getResources().getDrawable(R.drawable.icon);
    }

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="center"
    android:src="@{viewModel.imageRes}"/>


2

আমি অ্যান্ড্রয়েডে বিশেষজ্ঞ নই তবে বিদ্যমান সমাধানগুলি বোঝার জন্য আমি কয়েক ঘন্টা সময় ব্যয় করেছি। ভাল জিনিস হ'ল আমি ডেটা বাইন্ডিং ব্যবহার করে পুরো ধারণাটি উপলব্ধি করেছিBindingAdapter আরও ভাল । তার জন্য, আমি বিদ্যমান উত্তরগুলির জন্য কমপক্ষে কৃতজ্ঞ (যদিও বেশিরভাগ অসম্পূর্ণ)। এখানে পদ্ধতির সম্পূর্ণ ভাঙ্গন রয়েছে:

আমি BindingAdapterএই উদাহরণে ব্যবহার করব । প্রস্তুতি xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="model"
            type="blahblah.SomeViewModel"/>
    </data>

    <!-- blah blah -->

    <ImageView
        android:id="@+id/ImageView"
        app:appIconDrawable="@{model.packageName}"/>

    <!-- blah blah -->
</layout>

সুতরাং এখানে আমি কেবল গুরুত্বপূর্ণ জিনিস রাখছি:

  • SomeViewModelআমার হয় ViewModelবাঁধাই ডেটার জন্য আমি ব্যবহার। আপনি এমন একটি শ্রেণিও ব্যবহার করতে পারেন যা প্রসারিত BaseObservableএবং ব্যবহার করতে পারে @Bindable। যাইহোক, BindingAdapterএই উদাহরণে, কোনওViewModel বা BaseObservableশ্রেণিতে থাকতে হবে না ! একটি সরল শ্রেণি করবে! এটি পরে চিত্রিত করা হবে।
  • app:appIconDrawable="@{model.packageName}"। হ্যাঁ ... এটি সত্যিই আমার মাথাব্যথার কারণ ছিল! আসুন এটি ভেঙে দিন:
    • app:appIconDrawableএই কিছু হতে পারে: app:iCanBeAnything! সত্যিই। আপনিও রাখতে পারেন "android:src"! যাইহোক, আপনার পছন্দটিতে একটি নোট নিন, আমরা এটি পরে ব্যবহার করব!
    • "@ {Model.packageName}": আপনি যদি ডেটা বাঁধাইয়ের সাথে কাজ করেন তবে এটি পরিচিত। এটি পরে কীভাবে ব্যবহৃত হবে তা আমি দেখাব।

ধরে নেওয়া যাক আমরা এই সাধারণ পর্যবেক্ষণযোগ্য বর্গটি ব্যবহার করি:

public class SomeViewModel extends BaseObservable {
   private String packageName; // this is what @{model.packageName}
                               // access via the getPackageName() !!!
                               // Of course this needs to be set at some
                               // point in your program, before it makes
                               // sense to use it in the BindingAdapter.

   @Bindable
   public String getPackageName() {
       return packageName;
   }

   public void setPackageName(String packageName) {
       this.packageName = packageName;
       notifyPropertyChanged(BR.packageName);
   }

   // The "appIconDrawable" is what we defined above! 
   // Remember, they have to align!! As we said, we can choose whatever "app:WHATEVER".
   // The BindingAdapter and the xml need to be aligned, that's it! :)
   //
   // The name of the function, i.e. setImageViewDrawable, can also be 
   // whatever we want! Doesn't matter.
   @BindingAdapter({"appIconDrawable"})
   public static void setImageViewDrawable(ImageView imageView, String packageName) {
       imageView.setImageDrawable(Tools.getAppIconDrawable(imageView.getContext(), packageName));
   }
}

প্রতিশ্রুতি অনুসারে, আপনি public static void setImageViewDrawable()অন্য কোনও শ্রেণিতেও স্থানান্তর করতে পারেন , যেমন আপনার ক্লাস থাকতে পারে যার সংকলন রয়েছে BindingAdapters:

public class BindingAdapterCollection {
   @BindingAdapter({"appIconDrawable"})
   public static void setImageViewDrawable(ImageView imageView, String packageName) {
       imageView.setImageDrawable(Tools.getAppIconDrawable(imageView.getContext(), packageName));
   }
}

আরেকটি গুরুত্বপূর্ণ মন্তব্যটি আমার Observableক্লাসে আমি String packageNameঅতিরিক্ত তথ্য পাস করতাম setImageViewDrawable। আপনি উদাহরণস্বরূপ int resourceId, সংশ্লিষ্ট গিটার / সেটারগুলির সাথেও বেছে নিতে পারেন , যার জন্য অ্যাডাপ্টারটি হয়ে যায়:

public class SomeViewModel extends BaseObservable {
   private String packageName; // this is what @{model.packageName}
                               // access via the getPackageName() !!!
   private int resourceId;     // if you use this, don't forget to update
                               // your xml with: @{model.resourceId}

   @Bindable
   public String getPackageName() {
       return packageName;
   }

   public void setPackageName(String packageName) {
       this.packageName = packageName;
       notifyPropertyChanged(BR.packageName);
   }

   @Bindable
   public int getResourceId() {
       return packageName;
   }

   public void setResourceId(int resourceId) {
       this.resourceId = resourceId;
       notifyPropertyChanged(BR.resourceId);
   }

   // For this you use: app:appIconDrawable="@{model.packageName}" (passes String)
   @BindingAdapter({"appIconDrawable"})
   public static void setImageViewDrawable(ImageView imageView, String packageName) {
       imageView.setImageDrawable(Tools.getAppIconDrawable(imageView.getContext(), packageName));
   }

   // for this you use: app:appIconResourceId="@{model.resourceId}" (passes int)
   @BindingAdapter({"appIconResourceId"})
   public static void setImageViewResourceId(ImageView imageView, int resource) {
       imageView.setImageResource(resource);
   }
}

2

আমার জন্য এই কাজ। আমি মন্তব্য হিসাবে এটি @ hqzxzwb উত্তরে যুক্ত করতে চাই তবে খ্যাতি সীমাবদ্ধতার কারণে।

আমার ভিউ মডেলটিতে এটি আছে

var passport = R.drawable.passport

তারপরে আমার এক্সএমএলে, আমার আছে

android:src="@{context.getDrawable(model.passort)}"

এবং এটাই


ঠিক আছে তবে আপনি উল্লেখ করতে ভুলে গেছেন যে আপনাকে অবশ্যই প্রসঙ্গ আমদানি করতে হবে। আপনি আপনার উত্তর আপডেট করতে পারেন?
ডেডফিশ

1

ফ্রেস্কো (ফেসবুক ইমেজ লাইব্রেরি) ব্যবহার করে

 public class YourCustomBindingAdapters {

    //app:imageUrl="@{data.imgUri}"
    @BindingAdapter("bind:imageUrl")
    public static void loadImage(SimpleDraweeView imageView, String url) {
        if (url == null) {
            imageView.setImageURI(Uri.EMPTY);
        } else {
            if (url.length() == 0)
                imageView.setImageURI(Uri.EMPTY);
            else
                imageView.setImageURI(Uri.parse(url));
        }
    }
}

0

আপনার দর্শন স্থিতিতে বা মডেল শ্রেণিতে দেখুন;

 fun getSource(context: Context): Drawable? {
        return ContextCompat.getDrawable(context, R.drawable.your_source)
    }

আপনার এক্সএমএলে;

<androidx.appcompat.widget.AppCompatImageButton
   .
   .
   .
   android:src="@{viewState.getSource(context)}"

0
<?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>
        <variable
           name="model"
           type="YourViewModel"/>
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="?android:attr/selectableItemBackground"
          android:paddingStart="@dimen/dp16"
          android:paddingTop="@dimen/dp8"
          android:paddingEnd="@dimen/dp8"
          android:paddingBottom="@dimen/dp8">

          <ImageView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" 
              android:src="@{model.selected ? @drawable/check_fill : @drawable/check_empty}"/>

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.