সেটব্যাকগ্রাউন্ড বনাম সেটব্যাকগ্রাউন্ডড্রেইবল (অ্যান্ড্রয়েড)


258

আমি একটি দৃশ্যের পটভূমি অঙ্কনযোগ্য সেট করতে চাই। এর জন্য দুটি পদ্ধতি রয়েছে (যতদূর আমি দেখছি): setBackgroundএবং setBackgroundDrawable

আমি যখন ব্যবহার করি তখন setBackgroundএটি বলে যে এটি এপিআই লেভেল 16 এ যুক্ত হয়েছে তবে আমার প্রকল্পের ন্যূনতম এসডিকে সংস্করণটি 7 I আমি ধরে নিয়েছি এটি 16 এর নিচে কিছুতেই কাজ করবে না, আমি ঠিক আছি? তবে আমি যখন সেটব্যাকগ্রাউন্ডড্রেভযোগ্য ব্যবহার করি তখন এটি বলে যে এটি হ্রাস পেয়েছে।

আমার কী ব্যবহার করার কথা?


ব্যবহার করুন: image.setImageResource (আর .ড্রেব্যাবল.আইকন_ডট 1);
সাহসী

উত্তর:


403

এটি অবচয় করা হয়েছে তবে এটি এখনও কাজ করে যাতে আপনি এটি ব্যবহার করতে পারেন। তবে আপনি যদি পুরোপুরি সঠিক হতে চান তবে কেবল এর সম্পূর্ণতার জন্য ... আপনি নীচের মতো কিছু করতে চাই:

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    setBackgroundDrawable();
} else {
    setBackground();
}

এটি কাজ করার জন্য আপনাকে বিল্ডটারেট এপিআই 16 সেট করতে হবে এবং নূন্যতম বিল্ডটি 7 বা এর অনুরূপ কিছুতে সেট করতে হবে।


4
এটি এখনও সেটব্যাকগ্রাউন্ডড্রেইবলকে হ্রাস করা সম্পর্কে অভিযোগ করে। গুগল পদ্ধতির নাম পরিবর্তন করতে চেয়েছিল বলেই কি আমাকে সত্যিই দমন করতে হবে?
চার্লি-ব্লেক

2
@ স্যানটিরিভেরা92 হ্যাঁ আপনার কাছে আছে, বিকল্প হিসাবে আপনি 2 টি প্রকল্প 1 টার্গেট করে তৈরি করতে পারেন এটির আগে সমস্যা এবং 1 পরে। শব্দটি কি কোনও সহজ বিকল্পের মতো? (আসলে কখনও কখনও এটি হয়,
আইসিএসে এতগুলি

4
আমি সেট করেছি android:minSdkVersion="7" android:targetSdkVersion="17", তবে সেটব্যাকগ্রাউন্ড () ত্রুটি হিসাবে প্রকাশিত হয়েছে: কলটির জন্য এপিআই স্তর 16 প্রয়োজন (বর্তমান মিনিট 7)
জনি

20
এটি আমাকে সংকলন থেকে বাধা দিয়েছে। আমি সমস্যাযুক্ত কোডটিকে তার নিজস্ব ফাংশনে রেখেছি এবং কেবলমাত্র এই জাতীয় ফাংশনের জন্য লিঙ্কটি অক্ষম করে রেখেছি। @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @SuppressWarnings("deprecation") private static void setBg(RelativeLayout layout, BitmapDrawable TileMe) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { layout.setBackgroundDrawable(TileMe); } else { layout.setBackground(TileMe); } }
জনি

2
@ স্নিকোলাস হ্যাঁ, আইডিই বা অ্যান্ড্রয়েড আমাদের জন্য এই জাতীয় যুক্তি করতে সক্ষম হওয়া উচিত।
ওয়ারপজিট

111

setBackgroundResource()পরিবর্তে আপনি এপিআই স্তর 1 এর মধ্যে ব্যবহার করতে পারেন ।


78
... তবে কেবলমাত্র যদি আপনি একটি রিসোর্স আইডি পেয়ে থাকেন এবং আপনি তৈরি করেছেন এমন কাস্টম অঙ্কনযোগ্য ক্লাস না!
জোর্ডিড

আপনার কোনও রেফারেন্স রয়েছে এমন কোনও অঙ্কনযোগ্য আইডি পুনরুদ্ধার করার কোনও পদ্ধতি নেই?
পোট্রাথোর

2
সেটব্যাকগ্রাউন্ডড্রেসওয়েবল () সেটব্যাকগ্রাউন্ডড্রোয়েবল () এর বিকল্প নয়; বা সেটব্যাকগ্রাউন্ড ();। মোটেও সম্পর্কিত নয়, প্রথমটি রিসোর্স ড্রয়যোগ্য এবং অন্যটি কাস্টম ড্রয়িং যুক্ত করার জন্য।
এমবিএইচ

যদি আমাকে বারবার ব্যাকগ্রাউন্ড সেট করতে হয় তবে তালিকাভিউতে বলুন? setBackgroundResource(int)রিসোর্স আইডি গ্রহণ করে, অতএব এটি ব্যাকগ্রাউন্ড সেট করতে প্রতিটি সময় ভিউ স্ফীত করতে হবে। আমি ইতিমধ্যে ড্রয়াবলকে স্ফীত করেছি বলে ধরে নিয়ে আমি এ জাতীয় আচরণ চাই না। আমি কিছু অনুপস্থিত করছি?
আজিজবিকিয়ান

আমি যদি কেবল আঁকতে পারি !?
এমবিএইচ

55

উত্স কোড ( এই পোস্টটির ক্রেডিট ) হিসাবে দেখানো হিসাবে বর্তমানে 2 টি ফাংশনের মধ্যে কোনও পার্থক্য নেই বলে মনে হচ্ছে :

public void setBackground(Drawable background) {
    //noinspection deprecation
    setBackgroundDrawable(background);
}

@Deprecated
public void setBackgroundDrawable(Drawable background) { ... }

সুতরাং এটি কেবল একটি নামকরণের সিদ্ধান্ত, ফিল-প্যারেন্ট বনাম ম্যাচ-প্যারেন্টের মতো।


5
মহান! ধন্যবাদ। নির্বোধ যে ফাংশন নামকরণ হিসাবে খোঁড়া হিসাবে কিছু জন্য একটি সতর্কতা উত্পন্ন হয়।
কেউ কোথাও কোথাও

1
@ এমকাজেমআখগারি এই প্রথমবার নয় যে তারা কেবল নাম পরিবর্তনের জন্য কোনও কিছুকে অবজ্ঞা করে। লেআউট প্যারামের মানগুলির জন্য তাদের "ফিল_প্যারেন্ট" পরিবর্তন করে "ম্যাচ_পিতা" করা হয়েছে। উভয়ই একই জিনিস, একই মানের দিকে ইঙ্গিত করে ..
অ্যান্ড্রয়েড বিকাশকারী

18

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমার একই রকম পরিস্থিতি রয়েছে, এবং আমার সমাধান ছিল

button.setBackgroundResource( R.drawable.ic_button );
Drawable d = button.getBackground();

এবং তারপরে আপনি "অঙ্কনযোগ্য", রঙিন ফিল্টার ইত্যাদি প্রয়োগ করে খেলতে পারেন


6
মূল চিত্রটি যদি কোনও উত্স থেকে আসে তবে এটি কেবল কাজ করে।
ম্যাট হাগিনস

এটি ওপি-র প্রশ্নের উত্তরও দেয় না।
পেট্রো


12

আপনি setBackgroundResource()পরিবর্তে অর্থাত ব্যবহার করতে পারেrelativeLayout.setBackgroundResource(R.drawable.back);

এটা আমার জন্য কাজ করে।


7

এখন আপনি এই বিকল্পগুলির যে কোনও একটি ব্যবহার করতে পারেন। এবং এটি যে কোনও ক্ষেত্রে কাজ করতে যাচ্ছে। আপনার রঙ এইচএক্স কোড হতে পারে :

myView.setBackgroundResource(ContextCompat.getColor(context, Color.parseColor("#FFFFFF")));

এর মতো একটি রঙের সংস্থান :

myView.setBackgroundResource(ContextCompat.getColor(context,R.color.blue_background));

অথবা একটি কাস্টম এক্সএমএল সংস্থান , এর মতো:

myView.setBackgroundResource(R.drawable.my_custom_background);

আশা করি এটা সাহায্য করবে!


6

অ্যান্ড্রয়েড স্টুডিও 1.5.1.1 ব্যবহার করে আমি নিম্নলিখিত সতর্কতা পেয়েছি:

Call requires API level 16 (current min is 9): android.view.View#setBackground

এবং অবচয় সম্পর্কে অভিযোগগুলি

'setBackgroundDrawable(android.graphics.drawable.Drawable)' is deprecated

এই বিন্যাসটি ব্যবহার করে, আমি উভয় থেকে মুক্তি পেয়েছি:

    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        //noinspection deprecation
        layout.setBackgroundDrawable(drawable);
    } else {
        layout.setBackground(drawable);
    }

1

এটি আমার পক্ষে কাজ করে: ভিউ ভিউটি হ'ল আপনার এডিট টেক্সট, স্পিনার ... ইত্যাদি। এবং int অঙ্কনযোগ্য আপনার অঙ্কনযোগ্য রুটের উদাহরণ (আর.ড্রেব্যাবল.ইউরড্রেবল)

 public void verifyDrawable (View view, int drawable){

        int sdk = Build.VERSION.SDK_INT;

        if(sdk < Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackgroundDrawable(
                    ContextCompat.getDrawable(getContext(),drawable));
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackground(getResources().getDrawable(drawable));
        }    
    }

0

সেটব্যাকগ্রাউন্ডআর রিসোর্স ব্যবহার করুন (আর। ডিগ্রোয়েবল.এক্সএমএল / পিএনজি)


-2

আমারও এই সমস্যাটি ছিল, তবে আমি ইমেজভিউ ব্যবহার করে কাজটি করেছি

একটি ব্যবহার করার চেষ্টা করুন RelativeLayout এবং এটি (প্রস্থ এবং উচ্চতা: fill_parent, scaleType: কেন্দ্র) ভিতরে ImageView যোগ করুন।

এছাড়াও নিশ্চিত করুন যে চিত্রের ভিউটি রিলেটিভলআউটের ভিতরে প্রথম উপাদান , তাই এটি ব্যাকগ্রাউন্ড হিসাবে কাজ করবে।


1
আসলে এটি একটি ifধারা ছাড়া আর কিছু হওয়া উচিত ছিল না । সঠিক উত্তর দেখুন।
পাইজুসন

-4

আপনি এটি করতে পারেন:

try {
     myView.getClass().getMethod(android.os.Build.VERSION.SDK_INT >= 16 ? "setBackground" : "setBackgroundDrawable", Drawable.class).invoke(myView, myBackgroundDrawable);
} catch (Exception ex) {
     // do nothing
}

সম্পাদনা: @ ব্লেজেজকাজাপের ঠিক যেমনটি উল্লেখ করা হয়েছে, আপনি যদি তা ছাড়াই সমস্যার সমাধান করতে পারেন তবে প্রতিবিম্বটি ব্যবহার করা এড়ানো ভাল। আমার এমন একটি ব্যবহারের কেস ছিল যেখানে আমি প্রতিবিম্ব ছাড়াই সমাধান করতে সক্ষম হয়েছি তবে এটি উপরে নয়। আরও তথ্যের জন্য দয়া করে একবার দেখুন http://docs.oracle.com/javase/tutorial/reflect/index.html


4
@ ব্লেজেজক্যাজাপ এলওএল, তবে এটি প্রশ্নের উত্তর দেয়, সুতরাং কোনও ব্যাখ্যা ছাড়াই এটি হ্রাস করা উচিত নয়। যখন আপনি কোনও শিশুকে বলছেন যে তারা কেন এটি করবে তা না জানিয়ে কিছু না করার জন্য;)
ফ্যাব্রিকিও

11
আমি বিষয় ছেড়ে যেতে চাই না, তবে এখানে কয়েকটি কারণ রয়েছে: ১. জাভা একটি স্ট্যাটিকালি টাইপ করা ভাষা - সংকলকটি ব্যবহার করুন; ২. এটি ছদ্মবেশে কেবলমাত্র যদি একটি বিবৃতি হয় (এটি সত্য যুক্তি দেখায়); ৩. এটি একটি মশা মারার জন্য একটি কামান আনছে - এই কোডটি একটি তুচ্ছ সমস্যা সমাধানের জন্য কিছু গুরুতর কামান ব্যবহার করছে; আশা করি এটি কিছুটা ন্যায়সঙ্গত হয়েছে
Błażej Czapp

ধন্যবাদ @ ব্লেজেজক্যাজ্প, আপনি ঠিক বলেছেন, আমার এখানে একটি ব্যবহারের কেস ছিল যেখানে উপরের কোডের মতো কাজ করা দরকার ছিল তবে এটি পরিচালনা করার উপযুক্ত উপায় থাকলে এটি ব্যবহার করা উচিত নয়।
ফ্যাব্রিকিও

2
এটি বোবা ... এটি অর্জনের জন্য প্রতিবিম্বটি ব্যবহার করার কোনও কারণ নেই।
অ্যালেক্স লকউড

হ্যাঁ এমন একজনকে বলুন যিনি একটি সাধারণ প্রশ্ন জিজ্ঞাসা করেছেন "আমার কী ব্যবহার করা উচিত?" রান-টাইম পরিবর্তন করতে শুরু করুন।
পেট্রো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.