ধারণা এবং জেটপ্যাক কম্পোজ বাস্তবায়ন
রিসোর্স হলো সেইসব অতিরিক্ত ফাইল এবং স্ট্যাটিক কন্টেন্ট যা আপনার কোড ব্যবহার করে, যেমন বিটম্যাপ, লেআউট ডেফিনিশন, ইউজার ইন্টারফেস স্ট্রিং, অ্যানিমেশন নির্দেশনা এবং আরও অনেক কিছু।
আপনার কোড থেকে ছবি এবং স্ট্রিং-এর মতো অ্যাপ রিসোর্সগুলিকে সর্বদা আলাদা রাখুন, যাতে আপনি সেগুলিকে স্বাধীনভাবে রক্ষণাবেক্ষণ করতে পারেন। এছাড়াও, নির্দিষ্ট ডিভাইস কনফিগারেশনের জন্য বিকল্প রিসোর্স সরবরাহ করুন এবং সেগুলিকে বিশেষ নামের রিসোর্স ডিরেক্টরিতে একত্রিত করুন। রানটাইমে, অ্যান্ড্রয়েড বর্তমান কনফিগারেশনের উপর ভিত্তি করে উপযুক্ত রিসোর্সটি ব্যবহার করে। উদাহরণস্বরূপ, আপনি স্ক্রিনের আকারের উপর নির্ভর করে একটি ভিন্ন UI লেআউট বা ভাষার সেটিংসের উপর নির্ভর করে ভিন্ন স্ট্রিং সরবরাহ করতে চাইতে পারেন।
একবার আপনার অ্যাপের রিসোর্সগুলোকে এক্সটার্নালাইজ করলে, আপনি আপনার প্রোজেক্টের R ক্লাসে তৈরি হওয়া রিসোর্স আইডি ব্যবহার করে সেগুলোতে অ্যাক্সেস করতে পারবেন। এই ডকুমেন্টটিতে দেখানো হয়েছে কীভাবে আপনার অ্যান্ড্রয়েড প্রোজেক্টে রিসোর্সগুলোকে গ্রুপ করতে হয়। এছাড়াও, এতে দেখানো হয়েছে কীভাবে নির্দিষ্ট ডিভাইস কনফিগারেশনের জন্য বিকল্প রিসোর্স সরবরাহ করতে হয় এবং তারপর আপনার অ্যাপ কোড বা অন্যান্য XML ফাইল থেকে সেগুলোতে অ্যাক্সেস করতে হয়।
গ্রুপ রিসোর্স প্রকার
আপনার প্রোজেক্টের res/ ডিরেক্টরির একটি নির্দিষ্ট সাবডিরেক্টরিতে প্রতিটি ধরণের রিসোর্স রাখুন। উদাহরণস্বরূপ, একটি সাধারণ প্রোজেক্টের ফাইল কাঠামো নিচে দেওয়া হলো:
MyProject/
src/
MyActivity.java
res/
drawable/
graphic.png
layout/
main.xml
info.xml
mipmap/
icon.png
values/
strings.xml
res/ ` ডিরেক্টরির সাবডিরেক্টরিগুলোতে সমস্ত রিসোর্স থাকে: একটি ইমেজ রিসোর্স, দুটি লেআউট রিসোর্স, লঞ্চার আইকনগুলোর জন্য একটি mipmap/ ডিরেক্টরি এবং একটি স্ট্রিং রিসোর্স ফাইল। রিসোর্স ডিরেক্টরির নামগুলো গুরুত্বপূর্ণ এবং সেগুলো সারণি ১-এ বর্ণনা করা হয়েছে।
সারণি ১. প্রজেক্টের res/ ডিরেক্টরির অভ্যন্তরে সমর্থিত রিসোর্স ডিরেক্টরিসমূহ।
ডিরেক্টরি | সম্পদের ধরণ | |
| XML ফাইল যা প্রপার্টি অ্যানিমেশন নির্ধারণ করে। | |
| টুইন অ্যানিমেশন নির্ধারণকারী এক্সএমএল ফাইল। প্রপার্টি অ্যানিমেশনও এই ডিরেক্টরিতে সংরক্ষণ করা যেতে পারে, কিন্তু দুই ধরনের মধ্যে পার্থক্য করার জন্য প্রপার্টি অ্যানিমেশনের ক্ষেত্রে | |
| XML ফাইল যা রঙের একটি অবস্থা তালিকা নির্ধারণ করে। আরও তথ্যের জন্য, রঙের অবস্থা তালিকা রিসোর্স দেখুন। | |
| বিটম্যাপ ফাইল (PNG,
আরও তথ্যের জন্য, ড্রয়েবল রিসোর্স দেখুন। | |
| বিভিন্ন লঞ্চার আইকন ঘনত্বের জন্য ড্রয়েবল ফাইল। | |
| এক্সএমএল ফাইল যা ইউজার ইন্টারফেস লেআউট নির্ধারণ করে। আরও তথ্যের জন্য, লেআউট রিসোর্স দেখুন। | |
| এক্সএমএল ফাইল যা অ্যাপ মেনু, যেমন অপশন মেনু, কনটেক্সট মেনু বা সাবমেনু নির্ধারণ করে। আরও তথ্যের জন্য, মেনু রিসোর্স দেখুন। | |
| যেকোনো ফাইলকে তার মূল রূপে সংরক্ষণ করা যাবে। একটি র' তবে, যদি আপনার মূল ফাইলের নাম এবং ফাইলের স্তরবিন্যাস অ্যাক্সেস করার প্রয়োজন হয়, | |
| এক্সএমএল ফাইল, যেগুলোতে স্ট্রিং, পূর্ণসংখ্যা এবং রঙের মতো সাধারণ মান থাকে। যেখানে যেহেতু প্রতিটি রিসোর্স তার নিজস্ব XML এলিমেন্ট দিয়ে সংজ্ঞায়িত করা হয়, তাই আপনি ফাইলটির যেকোনো নাম দিতে পারেন এবং বিভিন্ন ধরনের রিসোর্স একটি ফাইলে রাখতে পারেন। তবে, স্বচ্ছতার জন্য, আপনি স্বতন্ত্র ধরনের রিসোর্সগুলো আলাদা ফাইলে রাখতে চাইতে পারেন। উদাহরণস্বরূপ, এই ডিরেক্টরিতে আপনি যে রিসোর্সগুলো তৈরি করতে পারেন, সেগুলোর জন্য কিছু ফাইলনামের প্রচলিত নিয়ম নিচে দেওয়া হলো:
আরও তথ্যের জন্য, স্ট্রিং রিসোর্স , স্টাইল রিসোর্স এবং আরও রিসোর্স প্রকার দেখুন। | |
| যেকোনো XML ফাইল যা রানটাইমে | |
| TTF, OTF, বা TTC-এর মতো এক্সটেনশনযুক্ত ফন্ট ফাইল অথবা XML ফাইল যেগুলিতে একটি অন্তর্ভুক্ত থাকে |
টেবিল ১-এ সংজ্ঞায়িত সাবডিরেক্টরিগুলিতে আপনি যে রিসোর্সগুলি সংরক্ষণ করেন, সেগুলিই আপনার ডিফল্ট রিসোর্স। অর্থাৎ, এই রিসোর্সগুলি আপনার অ্যাপের জন্য ডিফল্ট ডিজাইন এবং কন্টেন্ট নির্ধারণ করে। তবে, বিভিন্ন ধরনের অ্যান্ড্রয়েড-চালিত ডিভাইসের জন্য বিভিন্ন ধরনের রিসোর্সের প্রয়োজন হতে পারে।
উদাহরণস্বরূপ, অতিরিক্ত স্ক্রিন স্পেসের সদ্ব্যবহার করার জন্য আপনি স্বাভাবিকের চেয়ে বড় স্ক্রিনযুক্ত ডিভাইসগুলোর জন্য ভিন্ন লেআউট রিসোর্স সরবরাহ করতে পারেন। এছাড়াও, আপনি ভিন্ন স্ট্রিং রিসোর্স সরবরাহ করতে পারেন যা ডিভাইসের ভাষা সেটিংসের উপর ভিত্তি করে আপনার ইউজার ইন্টারফেসের টেক্সট অনুবাদ করে। বিভিন্ন ডিভাইস কনফিগারেশনের জন্য এই ভিন্ন রিসোর্সগুলো সরবরাহ করতে, আপনার ডিফল্ট রিসোর্সগুলোর পাশাপাশি বিকল্প রিসোর্সও সরবরাহ করতে হবে।
বিকল্প সংস্থান সরবরাহ করুন
বেশিরভাগ অ্যাপই নির্দিষ্ট ডিভাইস কনফিগারেশন সমর্থন করার জন্য বিকল্প রিসোর্স সরবরাহ করে। উদাহরণস্বরূপ, বিভিন্ন স্ক্রিন ডেনসিটির জন্য বিকল্প ড্রয়েবল রিসোর্স এবং বিভিন্ন ভাষার জন্য বিকল্প স্ট্রিং রিসোর্স অন্তর্ভুক্ত করুন। রানটাইমে, অ্যান্ড্রয়েড বর্তমান ডিভাইস কনফিগারেশন শনাক্ত করে এবং আপনার অ্যাপের জন্য উপযুক্ত রিসোর্স লোড করে।

চিত্র ১. স্ক্রিনের আকারের উপর ভিত্তি করে ভিন্ন লেআউট রিসোর্স ব্যবহারকারী দুটি ডিভাইস।
এক সেট রিসোর্সের জন্য কনফিগারেশন-নির্দিষ্ট বিকল্পগুলি উল্লেখ করতে, নিম্নলিখিতগুলি করুন:
res/ফোল্ডারে<resources_name>-<qualifier>ফরম্যাটে একটি নতুন ডিরেক্টরি তৈরি করুন।-
<resources_name>হলো সংশ্লিষ্ট ডিফল্ট রিসোর্সগুলোর ডিরেক্টরি নাম (যা সারণি ১-এ সংজ্ঞায়িত করা হয়েছে)। -
<qualifier>হলো একটি নাম যা একটি স্বতন্ত্র কনফিগারেশনকে নির্দিষ্ট করে, যার জন্য এই রিসোর্সগুলি ব্যবহার করা হবে (টেবিল ২-এ সংজ্ঞায়িত)।
আপনি একাধিক
<qualifier>যোগ করতে পারেন। প্রত্যেকটিকে একটি ড্যাশ দিয়ে আলাদা করুন।-
এই নতুন ডিরেক্টরিতে উপযুক্ত বিকল্প রিসোর্সগুলো সংরক্ষণ করুন। রিসোর্স ফাইলগুলোর নাম অবশ্যই ডিফল্ট রিসোর্স ফাইলগুলোর নামের সাথে হুবহু একই হতে হবে।
উদাহরণস্বরূপ, এখানে কিছু ডিফল্ট এবং বিকল্প রিসোর্স দেওয়া হলো:
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
hdpi কোয়ালিফায়ারটি নির্দেশ করে যে, ঐ ডিরেক্টরির রিসোর্সগুলো উচ্চ-ঘনত্বের স্ক্রিনযুক্ত ডিভাইসের জন্য। এই ড্রয়েবল ডিরেক্টরিগুলোর ছবিগুলো নির্দিষ্ট স্ক্রিন ডেনসিটির জন্য আকার দেওয়া থাকে, কিন্তু ফাইলের নামগুলো হুবহু একই থাকে। এইভাবে, icon.png বা background.png ছবিকে রেফারেন্স করার জন্য আপনি যে রিসোর্স আইডি ব্যবহার করেন, তা সবসময় একই থাকে। অ্যান্ড্রয়েড ডিভাইসের কনফিগারেশন তথ্যের সাথে রিসোর্স ডিরেক্টরির নামের কোয়ালিফায়ারগুলো তুলনা করে প্রতিটি রিসোর্সের সেই সংস্করণটি নির্বাচন করে যা বর্তমান ডিভাইসের সাথে সবচেয়ে ভালোভাবে মেলে।
সারণি ২-এ বৈধ কনফিগারেশন কোয়ালিফায়ারগুলো অগ্রাধিকারের ক্রমানুসারে তালিকাভুক্ত করা হয়েছে। আপনি প্রতিটি কোয়ালিফায়ারকে একটি ড্যাশ দিয়ে আলাদা করে একটি ডিরেক্টরি নামে একাধিক কোয়ালিফায়ার যোগ করতে পারেন। যদি আপনি একটি রিসোর্স ডিরেক্টরির জন্য একাধিক কোয়ালিফায়ার ব্যবহার করেন, তবে আপনাকে অবশ্যই সেগুলোকে সারণিতে তালিকাভুক্ত ক্রমানুসারে ডিরেক্টরি নামে যোগ করতে হবে।
সারণি ২. কনফিগারেশন কোয়ালিফায়ার নামসমূহ।
কনফিগারেশন | যোগ্যতা নির্ধারক মান | বর্ণনা |
এমসিসি এবং এমএনসি | উদাহরণ: | ডিভাইসের সিম কার্ড থেকে মোবাইল কান্ট্রি কোড (MCC) এবং এর পরে ঐচ্ছিকভাবে মোবাইল নেটওয়ার্ক কোড (MNC) দেওয়া হয়। উদাহরণস্বরূপ, যদি ডিভাইসটি রেডিও সংযোগ ব্যবহার করে (অর্থাৎ, এটি একটি জিএসএম ফোন), তাহলে এমসিসি এবং এমএনসি মানগুলো সিম কার্ড থেকে আসে। উদাহরণস্বরূপ, আপনার অ্যাপে দেশ-নির্দিষ্ট আইনি রিসোর্স অন্তর্ভুক্ত করার জন্য আপনি শুধু MCC-ও ব্যবহার করতে পারেন। যদি আপনাকে শুধুমাত্র ভাষার উপর ভিত্তি করে নির্দিষ্ট করতে হয়, তাহলে তার পরিবর্তে ভাষা, স্ক্রিপ্ট (ঐচ্ছিক), এবং অঞ্চল (ঐচ্ছিক) কোয়ালিফায়ার ব্যবহার করুন। আপনি যদি MCC এবং MNC কোয়ালিফায়ার ব্যবহার করেন, তবে সতর্কতার সাথে তা করুন এবং পরীক্ষা করে দেখুন যে এটি প্রত্যাশিতভাবে কাজ করছে কিনা। এছাড়াও |
ভাষা, লিপি (ঐচ্ছিক), এবং অঞ্চল (ঐচ্ছিক) | উদাহরণ: | ভাষাটি একটি দুই-অক্ষরের ISO 639-2 {:.external} ভাষা কোড দ্বারা সংজ্ঞায়িত করা হয়, যার পরে ঐচ্ছিকভাবে একটি দুই-অক্ষরের ISO 3166-1-alpha-2 {:.external} অঞ্চল কোড (ছোট হাতের কোডগুলো কেস-সেনসিটিভ নয় । অঞ্চলের অংশটিকে আলাদা করার জন্য অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪)-এ বিসিপি ৪৭ ল্যাঙ্গুয়েজ ট্যাগ {:.external}-এর সাপোর্ট চালু করা হয়েছে, যা আপনি ভাষা- এবং অঞ্চল-নির্দিষ্ট রিসোর্স চিহ্নিত করতে ব্যবহার করতে পারেন। একটি ল্যাঙ্গুয়েজ ট্যাগ এক বা একাধিক সাবট্যাগের একটি অনুক্রম দ্বারা গঠিত, যার প্রতিটি সামগ্রিক ট্যাগ দ্বারা চিহ্নিত ভাষার পরিসরকে পরিমার্জিত বা সংকুচিত করে। ল্যাঙ্গুয়েজ ট্যাগ সম্পর্কে আরও তথ্যের জন্য, “Tags for Identifying Languages {:.external}” দেখুন। একটি BCP 47 ল্যাঙ্গুয়েজ ট্যাগ ব্যবহার করতে, আপনার অ্যাপ চলাকালীন ব্যবহারকারীরা সিস্টেম সেটিংসে তাদের ভাষা পরিবর্তন করলে ল্যাঙ্গুয়েজ ট্যাগও পরিবর্তিত হতে পারে। রানটাইমে এটি আপনার অ্যাপকে কীভাবে প্রভাবিত করতে পারে সে সম্পর্কে জানতে, ‘কনফিগারেশন পরিবর্তন পরিচালনা’ দেখুন। অন্যান্য ভাষার জন্য আপনার অ্যাপ স্থানীয়করণ করার সম্পূর্ণ নির্দেশিকার জন্য, “আপনার অ্যাপ স্থানীয়করণ করুন” দেখুন। এছাড়াও |
| ব্যাকরণগত লিঙ্গ | masculinefeminineneuter | ব্যবহারকারীর ব্যাকরণগত লিঙ্গ। যেসব ভাষায় ব্যাকরণগত লিঙ্গ আছে, সেগুলোর জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, ফরাসিভাষী ব্যবহারকারীদের জন্য যদি আপনাকে বিভিন্ন রিসোর্স সরবরাহ করতে হয়, তাহলে আপনি নিম্নলিখিতগুলির মতো ডিরেক্টরি ব্যবহার করতে পারেন: দেখুন: অ্যান্ড্রয়েডে ব্যাকরণগত বিভক্তি । এছাড়াও এপিআই লেভেল ৩৪-এ যোগ করা হয়েছে। |
বিন্যাস দিকনির্দেশনা | | আপনার অ্যাপের লেআউটের দিক। এটি লেআউট, ড্রয়েবল বা ভ্যালুর মতো যেকোনো রিসোর্সের ক্ষেত্রে প্রযোজ্য হতে পারে। উদাহরণস্বরূপ, যদি আপনি আরবি ভাষার জন্য একটি নির্দিষ্ট লেআউট এবং ফারসি বা হিব্রুর মতো অন্য কোনো 'ডান থেকে বাম' ভাষার জন্য একটি সাধারণ লেআউট প্রদান করতে চান, তাহলে আপনি নিম্নলিখিতগুলির মতো ডিরেক্টরি ব্যবহার করবেন: দ্রষ্টব্য: আপনার অ্যাপের জন্য ডান থেকে বাম লেআউট বৈশিষ্ট্য সক্রিয় করতে, আপনাকে অবশ্যই এপিআই লেভেল ১৭-এ যোগ করা হয়েছে । |
সর্বনিম্ন প্রস্থ | উদাহরণ: ইত্যাদি। | একটি অ্যাপের জন্য উপলব্ধ স্ক্রিন এলাকার ক্ষুদ্রতম মাত্রা। নির্দিষ্টভাবে বলতে গেলে, অ্যাপ উইন্ডোর উদাহরণস্বরূপ, যদি আপনার লেআউটের জন্য প্রয়োজন হয় যে এর স্ক্রিন এলাকার ক্ষুদ্রতম মাত্রা সর্বদা কমপক্ষে ৬০০ ডিপি হবে, তাহলে আপনি সাধারণ স্ক্রিনের আকার নির্ধারণ করতে সর্বনিম্ন প্রস্থ ব্যবহার করা উপকারী, কারণ একটি লেআউট ডিজাইন করার ক্ষেত্রে প্রস্থই প্রায়শই মূল চালিকাশক্তি হয়ে থাকে। একটি UI প্রায়শই উল্লম্বভাবে স্ক্রল করে, কিন্তু অনুভূমিকভাবে এর প্রয়োজনীয় ন্যূনতম স্থানের উপর বেশ কিছু কঠোর সীমাবদ্ধতা থাকে। হ্যান্ডসেটের জন্য এক-পেন লেআউট নাকি ট্যাবলেটের জন্য বহু-পেন লেআউট ব্যবহার করা হবে, তা নির্ধারণের ক্ষেত্রেও উপলব্ধ প্রস্থ একটি মূল নির্ণায়ক। সুতরাং, প্রতিটি ডিভাইসে সর্বনিম্ন সম্ভাব্য প্রস্থ কত, সেটাই সম্ভবত আপনার কাছে সবচেয়ে গুরুত্বপূর্ণ। একটি ডিভাইসের সর্বনিম্ন প্রস্থ নির্ধারণ করার সময় স্ক্রিন ডেকোরেশন এবং সিস্টেম UI বিবেচনা করা হয়। উদাহরণস্বরূপ, যদি ডিভাইসটির স্ক্রিনে এমন স্থায়ী UI উপাদান থাকে যা সর্বনিম্ন প্রস্থের অক্ষ বরাবর জায়গা দখল করে, তাহলে সিস্টেম সর্বনিম্ন প্রস্থটিকে প্রকৃত স্ক্রিনের আকারের চেয়ে ছোট বলে ঘোষণা করে, কারণ সেই পিক্সেলগুলো আপনার UI-এর জন্য উপলব্ধ থাকে না। সাধারণ স্ক্রিন সাইজের জন্য আপনি এখানে কিছু মান ব্যবহার করতে পারেন:
যখন আপনার অ্যাপ এপিআই লেভেল ১৩-এ যোগ করা হয়েছে । এছাড়াও এই কোয়ালিফায়ার ব্যবহার করে বিভিন্ন স্ক্রিনের জন্য ডিজাইন করার বিষয়ে আরও তথ্যের জন্য, “ভিউ সহ রেসপন্সিভ/অ্যাডাপ্টিভ ডিজাইন” দেখুন। |
উপলব্ধ প্রস্থ এবং উচ্চতা | উদাহরণ: ইত্যাদি। | সর্বনিম্ন উপলব্ধ স্ক্রিন প্রস্থ বা উচ্চতা নির্দিষ্ট করে ( মাল্টিপেন লেআউট ব্যবহার করা হবে কিনা তা নির্ধারণ করার জন্য উপলব্ধ প্রস্থ এবং উচ্চতা প্রায়শই দরকারি হয়, কারণ এমনকি ট্যাবলেট ডিভাইসেও আপনি প্রায়শই ল্যান্ডস্কেপের মতো পোর্ট্রেট ওরিয়েন্টেশনের জন্য একই মাল্টিপেন লেআউট চান না। সুতরাং, স্ক্রিনের আকার এবং ওরিয়েন্টেশন উভয় কোয়ালিফায়ার একসাথে ব্যবহার করার পরিবর্তে, লেআউটের জন্য প্রয়োজনীয় ন্যূনতম প্রস্থ এবং/অথবা উচ্চতা নির্দিষ্ট করতে আপনি এগুলো ব্যবহার করতে পারেন। যখন আপনার অ্যাপ এই কনফিগারেশনগুলির জন্য বিভিন্ন মান সহ একাধিক রিসোর্স ডিরেক্টরি সরবরাহ করে, তখন সিস্টেম ডিভাইসের বর্তমান স্ক্রিন প্রস্থের সবচেয়ে কাছাকাছি (তবে অতিক্রম না করে) ডিরেক্টরিটি ব্যবহার করে। প্রকৃত স্ক্রিন প্রস্থ এবং নির্দিষ্ট প্রস্থের পার্থক্যের সাথে প্রকৃত স্ক্রিন উচ্চতা এবং নির্দিষ্ট উচ্চতার পার্থক্য যোগ করে 'সবচেয়ে কাছাকাছি' মানটি নির্ধারণ করা হয়, যেখানে অনির্দিষ্ট উচ্চতা এবং প্রস্থের মান ০ ধরা হয়। এই মানগুলিতে উইন্ডো ইনসেট দ্বারা দখলকৃত এলাকা অন্তর্ভুক্ত থাকে না, তাই যদি ডিভাইসটির ডিসপ্লের প্রান্তে স্থায়ী UI এলিমেন্ট থাকে, তাহলে প্রস্থ এবং উচ্চতার মান প্রকৃত স্ক্রিনের আকারের চেয়ে ছোট হয়, এমনকি যখন কিছু ভার্টিকাল স্ক্রিন ডেকোরেশন যা স্থির নয় (যেমন ফোনের স্ট্যাটাস বার যা ফুল স্ক্রিন করলে লুকানো যায়) এখানে বিবেচনা করা হয়নি , তেমনি টাইটেল বার বা অ্যাকশন বারের মতো উইন্ডো ডেকোরেশনগুলোও নয়। তাই অ্যাপগুলোকে তাদের নির্দিষ্ট করা জায়গার চেয়ে কিছুটা কম জায়গায় কাজ করার জন্য প্রস্তুত থাকতে হবে। দ্রষ্টব্য: সিস্টেম সেই রিসোর্সটি বেছে নেয় যা প্রস্থ এবং উচ্চতা উভয় ক্ষেত্রেই মিলে যায়। তাই, যে রিসোর্সে উভয়ই উল্লেখ করা থাকে, সেটি কেবল একটি উল্লেখ করা রিসোর্সের চেয়ে বেশি পছন্দের। উদাহরণস্বরূপ, যদি প্রকৃত স্ক্রিনটি ৭২০ ডিপি চওড়া এবং ১২৮০ ডিপি উঁচু হয় এবং একটি রিসোর্সকে w720dp হিসেবে নির্দিষ্ট করা থাকে ও অন্যটিকে w700dp-h1200dp হিসেবে নির্দিষ্ট করা থাকে, তবে পরেরটিই বেছে নেওয়া হবে, যদিও আগেরটি তার নির্দিষ্ট করা তথ্যের সাথে হুবহু মিলে যায়। এপিআই লেভেল ১৩-এ যোগ করা হয়েছে । এছাড়াও এই কোয়ালিফায়ার ব্যবহার করে বিভিন্ন স্ক্রিনের জন্য ডিজাইন করার বিষয়ে আরও তথ্যের জন্য, “ভিউ সহ রেসপন্সিভ/অ্যাডাপ্টিভ ডিজাইন” দেখুন। |
স্ক্রিনের আকার | |
দ্রষ্টব্য: সাইজ কোয়ালিফায়ার ব্যবহার করার অর্থ এই নয় যে রিসোর্সগুলো শুধুমাত্র সেই আকারের স্ক্রিনের জন্যই। আপনি যদি বর্তমান ডিভাইস কনফিগারেশনের সাথে আরও ভালোভাবে মেলে এমন কোয়ালিফায়ারসহ বিকল্প রিসোর্স প্রদান না করেন, তাহলে সিস্টেমটি সবচেয়ে উপযুক্ত রিসোর্সটি ব্যবহার করতে পারে। সতর্কতা: যদি আপনার সমস্ত রিসোর্স বর্তমান স্ক্রিনের চেয়ে বড় আকারের কোয়ালিফায়ার ব্যবহার করে, তাহলে সিস্টেম সেগুলি ব্যবহার করে না এবং রানটাইমে আপনার অ্যাপ ক্র্যাশ করে। উদাহরণস্বরূপ, এমনটা ঘটে যদি সমস্ত লেআউট রিসোর্সকে এপিআই লেভেল ৪-এ যোগ করা হয়েছে । এছাড়াও আরও তথ্যের জন্য, স্ক্রিন সামঞ্জস্যতার সংক্ষিপ্ত বিবরণ দেখুন। |
স্ক্রিন দিক | |
এপিআই লেভেল ৪-এ যোগ করা হয়েছে । এটি সম্পূর্ণরূপে স্ক্রিনের অ্যাসপেক্ট রেশিওর উপর ভিত্তি করে তৈরি ( এছাড়াও |
গোল পর্দা | |
এপিআই লেভেল ২৩-এ যোগ করা হয়েছে । এছাড়াও |
প্রশস্ত রঙের গামুট | |
এপিআই লেভেল ২৬-এ যোগ করা হয়েছে । এছাড়াও |
হাই ডাইনামিক রেঞ্জ (এইচডিআর) | |
এপিআই লেভেল ২৬-এ যোগ করা হয়েছে । এছাড়াও |
স্ক্রিন ওরিয়েন্টেশন | |
আপনার অ্যাপের কার্যকালে ব্যবহারকারী স্ক্রিন ঘোরালে এটি পরিবর্তিত হতে পারে। রানটাইমে এটি আপনার অ্যাপকে কীভাবে প্রভাবিত করে সে সম্পর্কে তথ্যের জন্য, ‘কনফিগারেশন পরিবর্তন পরিচালনা’ দেখুন। এছাড়াও |
UI মোড | |
API লেভেল ৮-এ যোগ করা হয়েছে; API ১৩-এ টেলিভিশন যোগ করা হয়েছে; API ১৬-এ অ্যাপ্লায়েন্স যোগ করা হয়েছে; API ২০-এ ঘড়ি যোগ করা হয়েছে; API ২৬-এ ভিআরহেডসেট যোগ করা হয়েছে । ডিভাইসটি ডকে ঢোকানো বা ডক থেকে সরানো হলে আপনার অ্যাপ কীভাবে সাড়া দিতে পারে, সে সম্পর্কে জানতে “ডকিংয়ের অবস্থা ও ধরন নির্ধারণ এবং পর্যবেক্ষণ করুন” পড়ুন। আপনার অ্যাপের কার্যকালে ব্যবহারকারী ডিভাইসটি ডকে রাখলে এটি পরিবর্তিত হতে পারে। আপনি |
নাইট মোড | |
এপিআই লেভেল ৮-এ যোগ করা হয়েছে । আপনার অ্যাপের কার্যকালে এটি পরিবর্তিত হতে পারে, যদি নাইট মোড অটো মোডে (ডিফল্ট) রাখা হয়, সেক্ষেত্রে মোডটি দিনের সময়ের উপর ভিত্তি করে পরিবর্তিত হয়। আপনি |
স্ক্রিন পিক্সেল ঘনত্ব (ডিপিআই) | |
ছয়টি প্রধান ডেনসিটির মধ্যে ৩:৪:৬:৮:১২:১৬ স্কেলিং অনুপাত রয়েছে (tvdpi ডেনসিটি উপেক্ষা করে)। সুতরাং, ldpi-তে একটি ৯x৯ বিটম্যাপ mdpi-তে ১২x১২, hdpi-তে ১৮x১৮, xhdpi-তে ২৪x২৪, ইত্যাদি হয়ে থাকে। দ্রষ্টব্য: ডেনসিটি কোয়ালিফায়ার ব্যবহার করার অর্থ এই নয় যে রিসোর্সগুলো শুধুমাত্র সেই ডেনসিটির স্ক্রিনগুলোর জন্যই প্রযোজ্য। আপনি যদি বর্তমান ডিভাইস কনফিগারেশনের সাথে আরও ভালোভাবে মেলে এমন কোয়ালিফায়ারসহ বিকল্প রিসোর্স প্রদান না করেন, তাহলে সিস্টেমটি সবচেয়ে উপযুক্ত রিসোর্সটিই ব্যবহার করবে। বিভিন্ন স্ক্রিন ডেনসিটি কীভাবে সামলাতে হয় এবং অ্যান্ড্রয়েড কীভাবে আপনার বিটম্যাপগুলিকে বর্তমান ডেনসিটির সাথে মানানসই করার জন্য স্কেল করতে পারে, সে সম্পর্কে আরও তথ্যের জন্য, স্ক্রিন সামঞ্জস্যতার সংক্ষিপ্ত বিবরণ দেখুন। |
টাচস্ক্রিন টাইপ | |
এছাড়াও |
কিবোর্ডের প্রাপ্যতা | |
আপনি যদি আপনার অ্যাপের কার্যকালে ব্যবহারকারী যদি একটি হার্ডওয়্যার কিবোর্ড খোলেন, তবে এটি পরিবর্তিত হতে পারে। রানটাইমে এটি আপনার অ্যাপকে কীভাবে প্রভাবিত করে, সে সম্পর্কে তথ্যের জন্য ‘কনফিগারেশন পরিবর্তন পরিচালনা ’ দেখুন। এছাড়াও |
প্রাথমিক পাঠ্য ইনপুট পদ্ধতি | |
এছাড়াও |
নেভিগেশন কী উপলব্ধতা | |
আপনার অ্যাপের কার্যকালে ব্যবহারকারী নেভিগেশন কীগুলো প্রকাশ করলে এটি পরিবর্তিত হতে পারে। রানটাইমে এটি আপনার অ্যাপকে কীভাবে প্রভাবিত করে সে সম্পর্কে তথ্যের জন্য, ‘কনফিগারেশন পরিবর্তন পরিচালনা’ দেখুন। এছাড়াও |
প্রাথমিক নন-টাচ নেভিগেশন পদ্ধতি | |
এছাড়াও |
প্ল্যাটফর্ম সংস্করণ (এপিআই স্তর) | উদাহরণ: ইত্যাদি। | ডিভাইস দ্বারা সমর্থিত এপিআই লেভেল। উদাহরণস্বরূপ, এপিআই লেভেল ১-এর জন্য |
কোয়ালিফায়ার নামের নিয়মাবলী
কনফিগারেশন কোয়ালিফায়ার নাম ব্যবহারের কিছু নিয়ম নিচে দেওয়া হলো:
- আপনি ড্যাশ দিয়ে আলাদা করে একটিমাত্র রিসোর্স সেটের জন্য একাধিক কোয়ালিফায়ার নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ,
drawable-en-rUS-landল্যান্ডস্কেপ ওরিয়েন্টেশনে থাকা ইউএস-ইংলিশ ডিভাইসগুলোর জন্য প্রযোজ্য। - যোগ্যতা নির্ধারকগুলো অবশ্যই সারণি ২- এ তালিকাভুক্ত ক্রমানুসারে থাকতে হবে।
- ভুল:
drawable-hdpi-port/ - সঠিক:
drawable-port-hdpi/
- ভুল:
- বিকল্প রিসোর্স ডিরেক্টরিগুলো একটির ভেতরে আরেকটি রাখা যায় না। উদাহরণস্বরূপ,
res/drawable/drawable-en/থাকতে পারে না। - মানগুলো কেস-ইনসেনসিটিভ। কেস-ইনসেনসিটিভ ফাইল সিস্টেমে সমস্যা এড়ানোর জন্য রিসোর্স কম্পাইলার প্রসেসিংয়ের আগে ডিরেক্টরির নামগুলোকে ছোট হাতের অক্ষরে রূপান্তর করে। নামগুলোতে বড় হাতের অক্ষর ব্যবহার করা হয় শুধুমাত্র পাঠযোগ্যতা বাড়ানোর জন্য।
- প্রতিটি কোয়ালিফায়ার টাইপের জন্য শুধুমাত্র একটি ভ্যালু সমর্থিত। উদাহরণস্বরূপ, আপনি যদি স্পেন এবং ফ্রান্সের জন্য একই ড্রয়েবল ফাইল ব্যবহার করতে চান, তাহলে আপনি
drawable-es-fr/` নামের কোনো ডিরেক্টরি রাখতে পারবেন না । এর পরিবর্তে, আপনারdrawable-es/এবংdrawable-fr/-এর মতো দুটি রিসোর্স ডিরেক্টরি প্রয়োজন, যেগুলোতে উপযুক্ত ফাইলগুলো থাকবে। তবে, আপনাকে দুটি স্থানেই ফাইলগুলো হুবহু নকল করার প্রয়োজন নেই। এর পরিবর্তে, আপনি কোনো রিসোর্সের জন্য একটি অ্যালিয়াস তৈরি করতে পারেন, যেমনটি ` Create alias resources` বিভাগে বর্ণনা করা হয়েছে।
এই কোয়ালিফায়ারগুলো দিয়ে নাম দেওয়া ডিরেক্টরিতে বিকল্প রিসোর্সগুলো সেভ করার পর, অ্যান্ড্রয়েড বর্তমান ডিভাইস কনফিগারেশনের উপর ভিত্তি করে আপনার অ্যাপে রিসোর্সগুলো স্বয়ংক্রিয়ভাবে প্রয়োগ করে। প্রতিবার কোনো রিসোর্সের জন্য অনুরোধ করা হলে, অ্যান্ড্রয়েড সেই অনুরোধ করা রিসোর্স ফাইলটি আছে এমন বিকল্প রিসোর্স ডিরেক্টরিগুলো খুঁজে দেখে এবং তারপর সবচেয়ে উপযুক্ত রিসোর্সটি খুঁজে বের করে ।
যদি কোনো নির্দিষ্ট ডিভাইস কনফিগারেশনের সাথে মেলে এমন কোনো বিকল্প রিসোর্স না থাকে, তাহলে অ্যান্ড্রয়েড সংশ্লিষ্ট ডিফল্ট রিসোর্সগুলো ব্যবহার করে—যা হলো একটি নির্দিষ্ট রিসোর্স টাইপের জন্য রিসোর্সের সেই সেট, যেগুলোতে কোনো কনফিগারেশন কোয়ালিফায়ার অন্তর্ভুক্ত থাকে না।
উপনাম সম্পদ তৈরি করুন
যখন আপনার কাছে এমন কোনো রিসোর্স থাকে যা আপনি একাধিক ডিভাইস কনফিগারেশনের জন্য ব্যবহার করতে চান কিন্তু সেটিকে ডিফল্ট রিসোর্স হিসেবে প্রদান করতে চান না, তখন একই রিসোর্স একাধিক বিকল্প রিসোর্স ডিরেক্টরিতে রাখার প্রয়োজন নেই। এর পরিবর্তে, আপনি একটি বিকল্প রিসোর্স তৈরি করতে পারেন যা আপনার ডিফল্ট রিসোর্স ডিরেক্টরিতে সংরক্ষিত কোনো রিসোর্সের অ্যালিয়াস (alias) হিসেবে কাজ করবে।
উদাহরণস্বরূপ, ধরুন আপনার কাছে icon.png একটি অ্যাপ আইকন আছে এবং বিভিন্ন লোকেলের জন্য এটির একটি স্বতন্ত্র সংস্করণ প্রয়োজন। কিন্তু, দুটি লোকেল, ইংলিশ-কানাডিয়ান এবং ফ্রেঞ্চ-কানাডিয়ান, একই সংস্করণ ব্যবহার করতে চায়। ইংলিশ-কানাডিয়ান এবং ফ্রেঞ্চ-কানাডিয়ান উভয়ের জন্য একই ইমেজ রিসোর্স ডিরেক্টরিতে কপি করার প্রয়োজন নেই। এর পরিবর্তে, আপনি উভয়ের জন্য ব্যবহৃত ইমেজটি icon.png ছাড়া অন্য যেকোনো নামে, যেমন icon_ca.png , সেভ করে ডিফল্ট res/drawable/ ডিরেক্টরিতে রাখতে পারেন। এরপর res/drawable-en-rCA/ এবং res/drawable-fr-rCA/ ডিরেক্টরিতে একটি icon.xml ফাইল তৈরি করুন, যা <bitmap> এলিমেন্ট ব্যবহার করে icon_ca.png রিসোর্সটিকে নির্দেশ করবে। এর ফলে আপনি PNG ফাইলের কেবল একটি সংস্করণ এবং সেটিকে নির্দেশকারী দুটি ছোট XML ফাইল সংরক্ষণ করতে পারবেন। বিস্তারিত জানার জন্য পরবর্তী সেকশনগুলোর উদাহরণ দেখুন।
অঙ্কনযোগ্য
বিদ্যমান কোনো ড্রয়েবলের অ্যালিয়াস তৈরি করতে, <drawable> এলিমেন্টটি ব্যবহার করুন:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="icon">@drawable/icon_ca</drawable>
</resources>
আপনি যদি এই ফাইলটিকে res/values-en-rCA/ মতো কোনো বিকল্প রিসোর্স ডিরেক্টরিতে icon.xml হিসেবে সেভ করেন, তাহলে এটি এমন একটি রিসোর্সে কম্পাইল হয় যাকে আপনি R.drawable.icon হিসেবে রেফারেন্স করতে পারেন, কিন্তু এটি আসলে R.drawable.icon_ca রিসোর্সের একটি অ্যালিয়াস, যা res/drawable/ এ সেভ করা থাকে।
লেআউট
বিদ্যমান লেআউটের একটি অ্যালিয়াস তৈরি করতে, <merge> এর মধ্যে <include> এলিমেন্টটি ব্যবহার করুন:
<?xml version="1.0" encoding="utf-8"?>
<merge>
<include layout="@layout/main_ltr"/>
</merge>
আপনি যদি এই ফাইলটি main.xml হিসাবে সংরক্ষণ করেন, তাহলে এটি এমন একটি রিসোর্সে কম্পাইল হয় যাকে আপনি R.layout.main হিসাবে উল্লেখ করতে পারেন, কিন্তু এটি আসলে R.layout.main_ltr রিসোর্সের একটি উপনাম (alias)।
আপনার অ্যাপের রিসোর্স অ্যাক্সেস করুন
আপনার অ্যাপ্লিকেশনে একবার কোনো রিসোর্স প্রদান করলে, আপনি তার রিসোর্স আইডি উল্লেখ করে সেটি প্রয়োগ করতে পারেন। সমস্ত রিসোর্স আইডি আপনার প্রোজেক্টের R ক্লাসে সংজ্ঞায়িত করা থাকে, যা aapt টুলটি স্বয়ংক্রিয়ভাবে তৈরি করে।
When your application is compiled, aapt generates the R class, which contains resource IDs for all the resources in your res/ directory. For each type of resource, there is an R subclass, such as R.drawable for all drawable resources. And for each resource of that type, there is a static integer, for example, R.drawable.icon . This integer is the resource ID that you can use to retrieve your resource.
Although the R class is where resource IDs are specified, you don't need to look there to discover a resource ID. A resource ID is always composed of the following:
- The resource type : each resource is grouped into a "type," such as
string, drawable, andlayout. For more information about the different types, see Resource types overview . - The resource name , which is either the filename excluding the extension or the value in the XML
android:nameattribute, if the resource is a simple value, such as a string.
There are two ways you can access a resource:
- In code: using a static integer from a subclass of your
Rclass, such as:R.string.hellostringis the resource type andhellois the resource name. There are many Android APIs that can access your resources when you provide a resource ID in this format. For more information, see the Access resources in code section. - In XML: using a special XML syntax that corresponds to the resource ID defined in your
Rclass, such as:@string/hellostringis the resource type andhellois the resource name. You can use this syntax in an XML resource any place where a value is expected that you provide in a resource. For more information, see the Access resources from XML section.
Access resources in code
You can use a resource in code by passing the resource ID as a method parameter. For example, you can set an ImageView to use the res/drawable/myimage.png resource using setImageResource :
কোটলিন
val imageView = findViewById(R.id.myimageview) as ImageView
imageView.setImageResource(R.drawable.myimage)
জাভা
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
You can also retrieve individual resources using methods in Resources , which you can get an instance of with getResources .
সিনট্যাক্স
Here's the syntax to reference a resource in code:
[<package_name>.]R.<resource_type>.<resource_name>
-
<package_name>is the name of the package in which the resource is located (not required when referencing resources from your own package). -
<resource_type>is theRsubclass for the resource type. -
<resource_name>is either the resource filename without the extension or theandroid:nameattribute value in the XML element, for simple values.
ব্যবহারের ক্ষেত্র
There are many methods that accept a resource ID parameter, and you can retrieve resources using methods in Resources . You can get an instance of Resources using Context.getResources .
Here are some examples of accessing resources in code:
কোটলিন
// Load a background for the current screen from a drawable resource.
window.setBackgroundDrawableResource(R.drawable.my_background_image)
// Set the Activity title by getting a string from the Resources object, because
// this method requires a CharSequence rather than a resource ID.
window.setTitle(resources.getText(R.string.main_title))
// Load a custom layout for the current screen.
setContentView(R.layout.main_screen)
// Set a slide in animation by getting an Animation from the Resources object.
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.hyperspace_in))
// Set the text on a TextView object using a resource ID.
val msgTextView = findViewById(R.id.msg) as TextView
msgTextView.setText(R.string.hello_message)
জাভা
// Load a background for the current screen from a drawable resource.
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;
// Set the Activity title by getting a string from the Resources object, because
// this method requires a CharSequence rather than a resource ID.
getWindow().setTitle(getResources().getText(R.string.main_title));
// Load a custom layout for the current screen.
setContentView(R.layout.main_screen);
// Set a slide in animation by getting an Animation from the Resources object.
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.hyperspace_in));
// Set the text on a TextView object using a resource ID.
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);
Access resources from XML
You can define values for some XML attributes and elements using a reference to an existing resource. You often do this when creating layout files, to supply strings and images for your widgets.
For example, if you add a Button to your layout, use a string resource for the button text:
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/submit" />
সিনট্যাক্স
Here is the syntax to reference a resource in an XML resource:
@[<package_name>:]<resource_type>/<resource_name>
-
<package_name>is the name of the package in which the resource is located (not required when referencing resources from the same package). -
<resource_type>is theRsubclass for the resource type. -
<resource_name>is either the resource filename without the extension or theandroid:nameattribute value in the XML element, for simple values.
ব্যবহারের ক্ষেত্র
In some cases, you must use a resource for a value in XML, such as to apply a drawable image to a widget, but you can also use a resource in XML any place that accepts a simple value. For example, if you have the following resource file that includes a color resource and a string resource :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="opaque_red">#f00</color>
<string name="hello">Hello!</string>
</resources>
You can use these resources in the following layout file to set the text color and text string:
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@color/opaque_red"
android:text="@string/hello" />
In this case, you don't need to specify the package name in the resource reference, because the resources are from your own package. To reference a system resource, you need to include the package name, as shown in the following example:
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@android:color/secondary_text_dark"
android:text="@string/hello" />
You can even use resources in XML to create aliases. For example, you can create a drawable resource that is an alias for another drawable resource:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/other_drawable" />
This sounds redundant, but can be very useful when using alternative resource. For more information, see the section about creating alias resources .
Reference style attributes
A style attribute resource lets you reference the value of an attribute in the currently applied theme. Referencing a style attribute lets you customize the look of UI elements by styling them to match standard variations supplied by the current theme, instead of supplying a hardcoded value. Referencing a style attribute essentially says, "Use the style that is defined by this attribute in the current theme."
To reference a style attribute, the name syntax is almost identical to the normal resource format, but instead of the "at" symbol ( @ ), use a question mark ( ? ). The resource type portion is optional. So the reference syntax is as follows:
?[<package_name>:][<resource_type>/]<resource_name>
For example, here's how you can reference an attribute to set the text color to match the secondary text color of the system theme:
<EditText id="text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="?android:textColorSecondary"
android:text="@string/hello_world" />
Here, the android:textColor attribute specifies the name of a style attribute in the current theme. Android now uses the value applied to the android:textColorSecondary style attribute as the value for android:textColor in this widget. Because the system resource tool knows that an attribute resource is expected in this context, you don't need to explicitly state the type, which is ?android:attr/textColorSecondary . You can exclude the attr type.
Access original files
While uncommon, you might need to access your original files and directories. If you do, then saving your files in res/ won't work for you, because the only way to read a resource from res/ is with the resource ID. Instead, you can save your resources in the assets/ directory.
Files saved in the assets/ directory are not given a resource ID, so you can't reference them through the R class or from XML resources. Instead, you can query files in the assets/ directory like a normal file system and read raw data using AssetManager .
However, if all you require is the ability to read raw data (such as a video or audio file), then save the file in the res/raw/ directory and read a stream of bytes using openRawResource .
Access platform resources
Android contains a number of standard resources, such as styles, themes, and layouts. To access these resources, qualify your resource reference with the android package name. For example, Android provides a layout resource you can use for list items in a ListAdapter :
কোটলিন
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)
জাভা
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
In this example, simple_list_item_1 is a layout resource defined by the platform for items in a ListView . You can use this instead of creating your own layout for list items.
Provide the best device compatibility with resources
For your app to support multiple device configurations, it's very important that you always provide default resources for each type of resource that your app uses.
For example, if your app supports several languages, always include a values/ directory (in which your strings are saved) without a language and region qualifier . If you instead put all your string files in directories that have a language and region qualifier, then your app crashes when run on a device set to a language that your strings don't support.
As long as you provide default values/ resources, then your app runs properly, even if the user doesn't understand the language it presents. It's better than crashing.
Likewise, if you provide different layout resources based on the screen orientation, pick one orientation as your default. For example, instead of providing layout resources in layout-land/ for landscape and layout-port/ for portrait, leave one as the default, such as layout/ for landscape and layout-port/ for portrait.
Providing default resources is important not only because your app might run on a configuration you hadn't anticipated, but also because new versions of Android sometimes add configuration qualifiers that lower versions don't support. If you use a new resource qualifier, but maintain code compatibility with lower versions of Android, then when a lower version of Android runs your app, it crashes if you don't provide default resources, because it can't use the resources named with the new qualifier.
For example, if your minSdkVersion is set to 4, and you qualify all of your drawable resources using night mode ( night or notnight , which were added in API level 8), then an API level 4 device can't access your drawable resources and crashes. In this case, you probably want notnight to be your default resources, so exclude that qualifier and put your drawable resources in either drawable/ or drawable-night/ .
In short, to provide the best device compatibility, always provide default resources for the resources your app needs to perform properly. Then create alternative resources for specific device configurations using configuration qualifiers.
There is one exception to this rule: If your app's minSdkVersion is 4 or greater, you don't need default drawable resources when you provide alternative drawable resources with the screen density qualifier. Even without default drawable resources, Android can find the best match among the alternative screen densities and scale the bitmaps as necessary. However, for the best experience on all types of devices, provide alternative drawables for all three types of density.