অ্যাপ রিসোর্স ওভারভিউ

রিসোর্স হলো সেইসব অতিরিক্ত ফাইল এবং স্ট্যাটিক কন্টেন্ট যা আপনার কোড ব্যবহার করে, যেমন বিটম্যাপ, ইউজার ইন্টারফেস স্ট্রিং, অ্যানিমেশন নির্দেশনা এবং আরও অনেক কিছু।

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

একবার আপনার অ্যাপের রিসোর্সগুলোকে এক্সটার্নালাইজ করলে, আপনি আপনার প্রোজেক্টের R ক্লাসে তৈরি হওয়া রিসোর্স আইডি ব্যবহার করে সেগুলোতে অ্যাক্সেস করতে পারবেন। এই ডকুমেন্টটিতে দেখানো হয়েছে কীভাবে আপনার অ্যান্ড্রয়েড প্রোজেক্টে রিসোর্সগুলোকে গ্রুপ করতে হয়। এছাড়াও, এতে দেখানো হয়েছে কীভাবে নির্দিষ্ট ডিভাইস কনফিগারেশনের জন্য বিকল্প রিসোর্স সরবরাহ করতে হয় এবং তারপর আপনার অ্যাপ কোড বা অন্যান্য XML ফাইল থেকে সেগুলোতে অ্যাক্সেস করতে হয়।

গ্রুপ রিসোর্স প্রকার

আপনার প্রোজেক্টের res/ ডিরেক্টরির একটি নির্দিষ্ট সাবডিরেক্টরিতে প্রতিটি ধরণের রিসোর্স রাখুন। উদাহরণস্বরূপ, একটি সাধারণ প্রোজেক্টের ফাইল কাঠামো নিচে দেওয়া হলো:

MyProject/
    src/
        MyActivity.kt
    res/
        drawable/
            graphic.png
        mipmap/
            icon.png
        values/
            strings.xml

res/ ডিরেক্টরির সাবডিরেক্টরিগুলোতে সমস্ত রিসোর্স থাকে: একটি ইমেজ রিসোর্স, লঞ্চার আইকনগুলোর জন্য একটি mipmap/ ডিরেক্টরি এবং একটি স্ট্রিং রিসোর্স ফাইল। রিসোর্স ডিরেক্টরির নামগুলো গুরুত্বপূর্ণ এবং সেগুলো সারণি ১-এ বর্ণনা করা হয়েছে।

দ্রষ্টব্য: mipmap ফোল্ডার ব্যবহার সম্পর্কে আরও তথ্যের জন্য, “mipmap ডিরেক্টরিতে অ্যাপ আইকন রাখুন” দেখুন।

সারণি ১. প্রজেক্টের res/ ডিরেক্টরির অভ্যন্তরে সমর্থিত রিসোর্স ডিরেক্টরিসমূহ।

ডিরেক্টরি সম্পদের ধরণ
drawable/

বিটম্যাপ ফাইল (PNG, .9.png , JPG, বা GIF) অথবা এক্সএমএল ফাইল যা নিম্নলিখিত ড্রয়েবল রিসোর্স সাবটাইপগুলিতে কম্পাইল করা হয়:

  • বিটম্যাপ ফাইল
  • নয়টি প্যাচ (পুনর্বিন্যাসযোগ্য বিটম্যাপ)
  • রাজ্য তালিকা
  • আকৃতি
  • অ্যানিমেশন ড্রয়েবল
  • অন্যান্য অঙ্কনযোগ্য

আরও তথ্যের জন্য, ড্রয়েবল রিসোর্স দেখুন।

mipmap/ বিভিন্ন লঞ্চার আইকন ঘনত্বের জন্য ড্রয়েবল ফাইল। mipmap/ ফোল্ডার ব্যবহার করে লঞ্চার আইকন পরিচালনা সম্পর্কে আরও তথ্যের জন্য, “mipmap ডিরেক্টরিতে অ্যাপ আইকন রাখুন” দেখুন।
raw/

যেকোনো ফাইলকে তার মূল রূপে সংরক্ষণ করা যাবে। একটি র' InputStream raw InputStream) দিয়ে এই রিসোর্সগুলো খুলতে, রিসোর্স আইডি (যা হলো R.raw. filename সহ Resources.openRawResource কল করুন।

তবে, যদি আপনার মূল ফাইলের নাম এবং ফাইলের স্তরবিন্যাস অ্যাক্সেস করার প্রয়োজন হয়, res/raw/ এর পরিবর্তে assets/ ডিরেক্টরিতে রিসোর্সগুলি সংরক্ষণ করার কথা বিবেচনা করুন। assets/ এর ফাইলগুলিকে কোনো রিসোর্স আইডি দেওয়া হয় না, তাই আপনি শুধুমাত্র AssetManager ব্যবহার করে সেগুলি পড়তে পারবেন।

values/

এক্সএমএল ফাইল, যেগুলোতে স্ট্রিং, পূর্ণসংখ্যা এবং রঙের মতো সাধারণ মান থাকে।

যেখানে res/ সাবডিরেক্টরিতে থাকা অন্যান্য XML রিসোর্স ফাইলগুলো XML ফাইলের নামের উপর ভিত্তি করে একটিমাত্র রিসোর্স নির্ধারণ করে, সেখানে values/ ডিরেক্টরির ফাইলগুলো একাধিক রিসোর্স বর্ণনা করে। এই ডিরেক্টরির কোনো ফাইলের ক্ষেত্রে, <resources> এলিমেন্টের প্রতিটি চাইল্ড একটিমাত্র রিসোর্স নির্ধারণ করে। উদাহরণস্বরূপ, একটি <string> এলিমেন্ট একটি R.string রিসোর্স তৈরি করে, এবং একটি <color> এলিমেন্ট একটি R.color রিসোর্স তৈরি করে।

যেহেতু প্রতিটি রিসোর্স তার নিজস্ব XML এলিমেন্ট দিয়ে সংজ্ঞায়িত করা হয়, তাই আপনি ফাইলটির যেকোনো নাম দিতে পারেন এবং বিভিন্ন ধরনের রিসোর্স একটি ফাইলে রাখতে পারেন। তবে, স্বচ্ছতার জন্য, আপনি স্বতন্ত্র ধরনের রিসোর্সগুলো আলাদা ফাইলে রাখতে চাইতে পারেন। উদাহরণস্বরূপ, এই ডিরেক্টরিতে আপনি যে রিসোর্সগুলো তৈরি করতে পারেন, সেগুলোর জন্য কিছু ফাইলনামের প্রচলিত নিয়ম নিচে দেওয়া হলো:

আরও তথ্যের জন্য, স্ট্রিং রিসোর্স , স্টাইল রিসোর্স এবং আরও রিসোর্স প্রকার দেখুন।

xml/ যেকোনো XML ফাইল যা রানটাইমে Resources.getXML কল করে পড়া যায়। বিভিন্ন XML কনফিগারেশন ফাইল এখানে সংরক্ষণ করতে হবে।
font/ TTF, OTF, বা TTC-এর মতো এক্সটেনশনযুক্ত ফন্ট ফাইল, অথবা <font-family> এলিমেন্ট অন্তর্ভুক্ত XML ফাইল। রিসোর্স হিসেবে ফন্ট সম্পর্কে আরও তথ্যের জন্য, "Add a font as an XML resource" দেখুন।

সতর্কতা: রিসোর্স ফাইলগুলো কখনোই সরাসরি res/ ডিরেক্টরির ভেতরে সেভ করবেন না। এতে কম্পাইলার ত্রুটি দেখা দেয়।

সারণি ১-এ সংজ্ঞায়িত সাবডিরেক্টরিগুলিতে আপনি যে রিসোর্সগুলি সংরক্ষণ করেন, সেগুলিই আপনার ডিফল্ট রিসোর্স। অর্থাৎ, এই রিসোর্সগুলি আপনার অ্যাপের জন্য ডিফল্ট ডিজাইন এবং বিষয়বস্তু নির্ধারণ করে। তবে, বিভিন্ন ধরনের অ্যান্ড্রয়েড-চালিত ডিভাইসের জন্য বিভিন্ন ধরনের রিসোর্সের প্রয়োজন হতে পারে।

উদাহরণস্বরূপ, আপনি বিভিন্ন স্ট্রিং রিসোর্স প্রদান করতে পারেন যা ডিভাইসের ভাষা সেটিংসের উপর ভিত্তি করে আপনার ইউজার ইন্টারফেসের টেক্সট অনুবাদ করবে।

দ্রষ্টব্য: Compose-এ UI, অ্যানিমেশন এবং স্টেট-চালিত রঙ Kotlin-এ ঘোষণা করা হয়, তাই layout/ , menu/ , anim/ , animator/ এবং color/ ডিরেক্টরিগুলি আধুনিক অ্যাপের জন্য অপ্রচলিত। আরও তথ্যের জন্য, Compose-এ অ্যানিমেশন এবং Compose-এ একটি থিমের গঠন দেখুন।

বিকল্প সংস্থান সরবরাহ করুন

বেশিরভাগ অ্যাপই নির্দিষ্ট ডিভাইস কনফিগারেশন সমর্থন করার জন্য বিকল্প রিসোর্স সরবরাহ করে। উদাহরণস্বরূপ, বিভিন্ন স্ক্রিন ডেনসিটির জন্য বিকল্প ড্রয়েবল রিসোর্স এবং বিভিন্ন ভাষার জন্য বিকল্প স্ট্রিং রিসোর্স অন্তর্ভুক্ত করুন। রানটাইমে, অ্যান্ড্রয়েড বর্তমান ডিভাইস কনফিগারেশন শনাক্ত করে এবং আপনার অ্যাপের জন্য উপযুক্ত রিসোর্স লোড করে।

এক সেট রিসোর্সের জন্য কনফিগারেশন-নির্দিষ্ট বিকল্পগুলি উল্লেখ করতে, নিম্নলিখিতগুলি করুন:

  1. res/ ফোল্ডারে <resources_name> - <qualifier> ফর্ম্যাটে একটি নতুন ডিরেক্টরি তৈরি করুন।
    • <resources_name> হলো সংশ্লিষ্ট ডিফল্ট রিসোর্সসমূহের ডিরেক্টরি নাম (যা সারণি ১-এ সংজ্ঞায়িত করা হয়েছে)।
    • <qualifier> হলো একটি নাম যা একটি স্বতন্ত্র কনফিগারেশনকে নির্দিষ্ট করে, যার জন্য এই রিসোর্সগুলি ব্যবহার করা হবে (টেবিল ২-এ সংজ্ঞায়িত)।

    আপনি একাধিক <qualifier> যোগ করতে পারেন। প্রত্যেকটিকে একটি ড্যাশ দিয়ে আলাদা করুন।

    সতর্কতা: একাধিক কোয়ালিফায়ার যুক্ত করার সময়, সেগুলোকে অবশ্যই টেবিল ২-এ তালিকাভুক্ত ক্রমানুসারে রাখতে হবে। কোয়ালিফায়ারগুলোর ক্রম ভুল হলে, রিসোর্সগুলো উপেক্ষা করা হবে।

  2. এই নতুন ডিরেক্টরিতে উপযুক্ত বিকল্প রিসোর্সগুলো সংরক্ষণ করুন। রিসোর্স ফাইলগুলোর নাম অবশ্যই ডিফল্ট রিসোর্স ফাইলগুলোর নামের সাথে হুবহু একই হতে হবে।

উদাহরণস্বরূপ, এখানে কিছু ডিফল্ট এবং বিকল্প রিসোর্স দেওয়া হলো:

res/
    drawable/
        icon.png
        background.png
    drawable-hdpi/
        icon.png
        background.png

hdpi কোয়ালিফায়ারটি নির্দেশ করে যে, ঐ ডিরেক্টরির রিসোর্সগুলো উচ্চ-ঘনত্বের স্ক্রিনযুক্ত ডিভাইসের জন্য। এই ড্রয়েবল ডিরেক্টরিগুলোর ছবিগুলো নির্দিষ্ট স্ক্রিন ডেনসিটির জন্য আকার দেওয়া থাকে, কিন্তু ফাইলের নামগুলো হুবহু একই থাকে। এইভাবে, icon.png বা background.png ছবিকে রেফারেন্স করার জন্য আপনি যে রিসোর্স আইডি ব্যবহার করেন, তা সবসময় একই থাকে। অ্যান্ড্রয়েড ডিভাইসের কনফিগারেশন তথ্যের সাথে রিসোর্স ডিরেক্টরির নামের কোয়ালিফায়ারগুলো তুলনা করে প্রতিটি রিসোর্সের সেই সংস্করণটি নির্বাচন করে যা বর্তমান ডিভাইসের সাথে সবচেয়ে ভালোভাবে মেলে।

সতর্কতা: কোনো বিকল্প রিসোর্স নির্ধারণ করার সময়, নিশ্চিত করুন যে আপনি ডিফল্ট কনফিগারেশনেও রিসোর্সটি নির্ধারণ করেছেন। অন্যথায়, ডিভাইসের কনফিগারেশন পরিবর্তন হলে আপনার অ্যাপে রানটাইম এক্সেপশন দেখা দিতে পারে। উদাহরণস্বরূপ, যদি আপনি শুধুমাত্র values-en এ একটি স্ট্রিং যোগ করেন এবং values না করেন, তাহলে ব্যবহারকারী ডিফল্ট সিস্টেমের ভাষা পরিবর্তন করলে আপনার অ্যাপে ' Resource Not Found ' এক্সেপশন দেখা দিতে পারে।

সারণি ২-এ কনফিগারেশন কোয়ালিফায়ারগুলো অগ্রাধিকারের ক্রমানুসারে তালিকাভুক্ত করা হয়েছে। আপনি প্রতিটি কোয়ালিফায়ারকে একটি ড্যাশ দিয়ে আলাদা করে একটি ডিরেক্টরি নামে একাধিক কোয়ালিফায়ার যোগ করতে পারেন। যদি আপনি একটি রিসোর্স ডিরেক্টরির জন্য একাধিক কোয়ালিফায়ার ব্যবহার করেন, তবে আপনাকে অবশ্যই সেগুলোকে সারণিতে তালিকাভুক্ত ক্রমানুসারে ডিরেক্টরি নামে যোগ করতে হবে।

সারণি ২. কনফিগারেশন কোয়ালিফায়ার নামসমূহ।

কনফিগারেশন যোগ্যতা নির্ধারক মান বর্ণনা
এমসিসি এবং এমএনসি উদাহরণ:
mcc310
mcc310-mnc004
mcc208-mnc00

ডিভাইসের সিম কার্ড থেকে মোবাইল কান্ট্রি কোড (MCC) এবং এর পরে ঐচ্ছিকভাবে মোবাইল নেটওয়ার্ক কোড (MNC) দেওয়া হয়। উদাহরণস্বরূপ, mcc310 যেকোনো ক্যারিয়ারে মার্কিন যুক্তরাষ্ট্রের জন্য, mcc310-mnc004 ভেরিজনে মার্কিন যুক্তরাষ্ট্রের জন্য এবং mcc208-mnc00 অরেঞ্জে ফ্রান্সের জন্য।

যদি ডিভাইসটি রেডিও সংযোগ ব্যবহার করে (অর্থাৎ, এটি একটি জিএসএম ফোন), তাহলে এমসিসি এবং এমএনসি মানগুলো সিম কার্ড থেকে আসে।

উদাহরণস্বরূপ, আপনার অ্যাপে দেশ-নির্দিষ্ট আইনি রিসোর্স অন্তর্ভুক্ত করার জন্য আপনি শুধু MCC-ও ব্যবহার করতে পারেন। যদি আপনাকে শুধুমাত্র ভাষার উপর ভিত্তি করে নির্দিষ্ট করতে হয়, তাহলে তার পরিবর্তে ভাষা, স্ক্রিপ্ট (ঐচ্ছিক), এবং অঞ্চল (ঐচ্ছিক) কোয়ালিফায়ার ব্যবহার করুন। আপনি যদি MCC এবং MNC কোয়ালিফায়ার ব্যবহার করেন, তবে সতর্কতার সাথে তা করুন এবং পরীক্ষা করে দেখুন যে এটি প্রত্যাশিতভাবে কাজ করছে কিনা।

এছাড়াও mcc এবং mnc কনফিগারেশন ফিল্ডগুলো দেখুন, যেগুলো যথাক্রমে বর্তমান মোবাইল কান্ট্রি কোড এবং মোবাইল নেটওয়ার্ক কোড নির্দেশ করে।

ভাষা, লিপি (ঐচ্ছিক), এবং অঞ্চল (ঐচ্ছিক) উদাহরণ:
en
fr
en-rUS
fr-rFR
fr-rCA
b+en
b+en+US
b+es+419
b+zh+Hant
b+sr+Latn+RS

ভাষাটি একটি দুই-অক্ষরের ISO 639-1 ভাষা কোড দ্বারা সংজ্ঞায়িত করা হয়, যার পরে ঐচ্ছিকভাবে একটি দুই-অক্ষরের ISO 3166-1-alpha-2 অঞ্চল কোড (ছোট হাতের ' r ' দ্বারা পূর্বে) যুক্ত থাকে।

কোডগুলো কেস-সেনসিটিভ নয় । অঞ্চলের অংশটিকে আলাদা করার জন্য r উপসর্গটি ব্যবহৃত হয়। আপনি একা কোনো অঞ্চল নির্দিষ্ট করতে পারবেন না।

অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪)-এ বিসিপি ৪৭ ল্যাঙ্গুয়েজ ট্যাগের জন্য সমর্থন চালু করা হয়েছে, যা আপনি ভাষা- এবং অঞ্চল-নির্দিষ্ট রিসোর্স চিহ্নিত করতে ব্যবহার করতে পারেন। একটি ল্যাঙ্গুয়েজ ট্যাগ এক বা একাধিক সাবট্যাগের একটি অনুক্রম দ্বারা গঠিত, যার প্রতিটি সামগ্রিক ট্যাগ দ্বারা চিহ্নিত ভাষার পরিসরকে পরিমার্জিত বা সংকুচিত করে। ল্যাঙ্গুয়েজ ট্যাগ সম্পর্কে আরও তথ্যের জন্য, “ভাষা শনাক্তকরণের জন্য ট্যাগ” দেখুন।

একটি BCP 47 ল্যাঙ্গুয়েজ ট্যাগ ব্যবহার করতে, b+ এবং একটি দুই-অক্ষরের ISO 639-1 ল্যাঙ্গুয়েজ কোড সংযুক্ত করুন, এবং ঐচ্ছিকভাবে এর পরে + দ্বারা পৃথক করা অতিরিক্ত সাবট্যাগ যোগ করতে পারেন।

আপনার অ্যাপ চলাকালীন ব্যবহারকারীরা সিস্টেম সেটিংসে তাদের ভাষা পরিবর্তন করলে ল্যাঙ্গুয়েজ ট্যাগও পরিবর্তিত হতে পারে। রানটাইমে এটি আপনার অ্যাপকে কীভাবে প্রভাবিত করতে পারে সে সম্পর্কে জানতে, ‘কনফিগারেশন পরিবর্তন পরিচালনা’ দেখুন।

অন্যান্য ভাষার জন্য আপনার অ্যাপ স্থানীয়করণ করার সম্পূর্ণ নির্দেশিকার জন্য, “আপনার অ্যাপ স্থানীয়করণ করুন” দেখুন।

এছাড়াও getLocales মেথডটি দেখুন, যা লোকালগুলোর নির্ধারিত তালিকা প্রদান করে। এই তালিকায় প্রাইমারি লোকালটি অন্তর্ভুক্ত থাকে।

ব্যাকরণগত লিঙ্গ masculine
feminine
neuter

ব্যবহারকারীর ব্যাকরণগত লিঙ্গ। যেসব ভাষায় ব্যাকরণগত লিঙ্গ আছে, সেগুলোর জন্য ব্যবহৃত হয়।

উদাহরণস্বরূপ, ফরাসিভাষী ব্যবহারকারীদের জন্য যদি আপনাকে বিভিন্ন রিসোর্স সরবরাহ করতে হয়, তাহলে আপনি নিম্নলিখিতগুলির মতো ডিরেক্টরি ব্যবহার করতে পারেন:

res/
values-fr/
strings.xml (অনির্দিষ্ট লিঙ্গ সহ ডিফল্ট স্ট্রিং)
values-fr-masculine/
strings.xml (পুংলিঙ্গ স্ট্রিং)
values-fr-feminine/
strings.xml (স্ত্রীলিঙ্গ স্ট্রিং)
values-fr-neuter/
strings.xml (নিরপেক্ষ লিঙ্গের স্ট্রিং)

ব্যাকরণগত লিঙ্গ ব্যবহার করে আপনার অ্যাপের UI ব্যক্তিগতকরণ দেখুন।

এছাড়াও getGrammaticalGender কনফিগারেশন মেথডটি দেখুন, যা ব্যাকরণগত লিঙ্গ নির্দেশ করে।

এপিআই লেভেল ৩৪-এ যোগ করা হয়েছে।

প্রশস্ত রঙের গামুট widecg
nowidecg
  • widecg : বিস্তৃত কালার গ্যামুটযুক্ত ডিসপ্লে, যেমন Display P3 বা AdobeRGB
  • nowidecg : sRGB-এর মতো সংকীর্ণ কালার গ্যামুটযুক্ত ডিসপ্লে

এপিআই লেভেল ২৬-এ যোগ করা হয়েছে।

এছাড়াও isScreenWideColorGamut কনফিগারেশন মেথডটি দেখুন, যা নির্দেশ করে স্ক্রিনটির কালার গ্যামাট প্রশস্ত কিনা।

হাই ডাইনামিক রেঞ্জ (এইচডিআর) highdr
lowdr
  • highdr : উচ্চ ডাইনামিক রেঞ্জ সহ ডিসপ্লে
  • lowdr : কম/সাধারণ ডাইনামিক রেঞ্জ সহ ডিসপ্লে

এপিআই লেভেল ২৬-এ যোগ করা হয়েছে।

এছাড়াও isScreenHdr কনফিগারেশন পদ্ধতিটি দেখুন, যা নির্দেশ করে স্ক্রিনটিতে HDR সক্ষমতা আছে কিনা।

UI মোড car
desk
television
appliance
watch
vrheadset
  • car : ডিভাইসটি গাড়ির ডকে প্রদর্শিত হচ্ছে
  • desk : ডিভাইসটি একটি ডেস্ক ডকে প্রদর্শিত হচ্ছে
  • television : ডিভাইসটি একটি টেলিভিশনে প্রদর্শিত হচ্ছে, যা একটি "টেন-ফুট" অভিজ্ঞতা প্রদান করে, যেখানে এর ইউজার ইন্টারফেস (UI) একটি বড় স্ক্রিনে থাকে যা থেকে ব্যবহারকারী দূরে থাকেন, এবং এই অভিজ্ঞতাটি মূলত ডি-প্যাড বা অন্যান্য নন-পয়েন্টার ইন্টারঅ্যাকশনকে কেন্দ্র করে গড়ে ওঠে।
  • appliance : ডিভাইসটি একটি অ্যাপ্লায়েন্স হিসেবে কাজ করছে, এতে কোনো ডিসপ্লে নেই।
  • watch : যে যন্ত্রে একটি ডিসপ্লে থাকে এবং যা কব্জিতে পরা হয়।
  • vrheadset : ডিভাইসটি একটি ভার্চুয়াল রিয়েলিটি হেডসেটে প্রদর্শিত হচ্ছে

এপিআই লেভেল ৮-এ যোগ করা হয়েছে; এপিআই ১৩-এ টেলিভিশন যোগ করা হয়েছে; এপিআই ১৬-এ অ্যাপ্লায়েন্স যোগ করা হয়েছে; এপিআই ২০-এ ঘড়ি যোগ করা হয়েছে; এপিআই ২৬-এ ভিআরহেডসেট যোগ করা হয়েছে।

ডিভাইসটি ডকে ঢোকানো বা ডক থেকে সরানো হলে আপনার অ্যাপ কীভাবে সাড়া দিতে পারে, সে সম্পর্কে জানতে “ডকিংয়ের অবস্থা ও ধরন নির্ধারণ এবং পর্যবেক্ষণ করুন” পড়ুন।

আপনার অ্যাপের কার্যকালে ব্যবহারকারী ডিভাইসটি ডকে রাখলে এটি পরিবর্তিত হতে পারে। আপনি UiModeManager ব্যবহার করে এই মোডগুলোর কয়েকটি চালু বা বন্ধ করতে পারেন। রানটাইমে এটি আপনার অ্যাপকে কীভাবে প্রভাবিত করে, সে সম্পর্কে জানতে ‘কনফিগারেশন পরিবর্তন পরিচালনা’ দেখুন।

নাইট মোড night
notnight
  • night : রাতের সময়
  • notnight : দিনের বেলা

এপিআই লেভেল ৮-এ যোগ করা হয়েছে।

আপনার অ্যাপের কার্যকালে এটি পরিবর্তিত হতে পারে, যদি নাইট মোড অটো মোডে (ডিফল্ট) রাখা হয়, সেক্ষেত্রে মোডটি দিনের সময়ের উপর ভিত্তি করে পরিবর্তিত হয়। আপনি UiModeManager ব্যবহার করে এই মোডটি চালু বা বন্ধ করতে পারেন। রানটাইমের সময় এটি আপনার অ্যাপকে কীভাবে প্রভাবিত করে সে সম্পর্কে তথ্যের জন্য, “কনফিগারেশন পরিবর্তন পরিচালনা করুন” দেখুন।

স্ক্রিন পিক্সেল ঘনত্ব (ডিপিআই) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnn dpi
  • ldpi : কম ঘনত্বের স্ক্রিন; প্রায় ১২০ ডিপিআই।
  • mdpi : মাঝারি-ঘনত্বের (প্রচলিত HVGA স্ক্রিনের জন্য); প্রায় ১৬০ ডিপিআই।
  • hdpi : উচ্চ-ঘনত্বের স্ক্রিন; প্রায় ২৪০ ডিপিআই।
  • xhdpi : অতিরিক্ত-উচ্চ-ঘনত্বের স্ক্রিন; প্রায় ৩২০ ডিপিআই। এপিআই লেভেল ৮-এ যোগ করা হয়েছে।
  • xxhdpi : অত্যন্ত উচ্চ-ঘনত্বের স্ক্রিন; প্রায় ৪৮০ ডিপিআই। এপিআই লেভেল ১৬-এ যোগ করা হয়েছে।
  • xxxhdpi : অতিরিক্ত-অতিরিক্ত-অতিরিক্ত-উচ্চ-ঘনত্বের ব্যবহার (শুধুমাত্র লঞ্চার আইকনের জন্য— বিভিন্ন পিক্সেল ঘনত্ব সমর্থন দেখুন); প্রায় ৬৪০ ডিপিআই। এপিআই লেভেল ১৮-এ যোগ করা হয়েছে।
  • nodpi : এমন বিটম্যাপ রিসোর্সের জন্য ব্যবহৃত হয়, যেগুলোকে আপনি ডিভাইসের ঘনত্বের সাথে মেলানোর জন্য স্কেল করতে চান না।
  • tvdpi : mdpi এবং hdpi-এর মাঝামাঝি একটি স্ক্রিন ডেনসিটি; প্রায় ২১৩ ডিপিআই। এটিকে একটি "প্রাথমিক" ডেনসিটি গ্রুপ হিসেবে বিবেচনা করা হয় না। এটি মূলত ৭২০পি টেলিভিশনের জন্য তৈরি, এবং বেশিরভাগ অ্যাপের এটির প্রয়োজন হয় না। ১০৮০পি টিভি প্যানেলের জন্য xhdpi এবং ৪কে টিভি প্যানেলের জন্য xxxhdpi ব্যবহার করুন। এপিআই লেভেল ১৩-এ এটি যুক্ত করা হয়েছে।
  • anydpi : সকল স্ক্রিন ডেনসিটির সাথে মেলে এবং অন্যান্য কোয়ালিফায়ারের চেয়ে অগ্রাধিকার পায়। এটি ভেক্টর ড্রয়েবলের জন্য উপযোগী। এপিআই লেভেল ২১-এ যোগ করা হয়েছে।
  • nnn dpi : এটি নন-স্ট্যান্ডার্ড ডেনসিটি বোঝাতে ব্যবহৃত হয়, যেখানে nnn হলো একটি ধনাত্মক পূর্ণসংখ্যা স্ক্রিন ডেনসিটি। বেশিরভাগ ক্ষেত্রে এটি ব্যবহৃত হয় না। স্ট্যান্ডার্ড ডেনসিটি বাকেট ব্যবহার করলে বাজারে উপলব্ধ বিভিন্ন ডিভাইসের স্ক্রিন ডেনসিটি সাপোর্ট করার অতিরিক্ত কাজ অনেকটাই কমে যায়।

ছয়টি প্রধান ডেনসিটির মধ্যে ৩:৪:৬:৮:১২:১৬ স্কেলিং অনুপাত রয়েছে (tvdpi ডেনসিটি উপেক্ষা করে)। সুতরাং, ldpi-তে একটি ৯x৯ বিটম্যাপ mdpi-তে ১২x১২, hdpi-তে ১৮x১৮, xhdpi-তে ২৪x২৪, ইত্যাদি হয়ে থাকে।

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

বিভিন্ন স্ক্রিন ডেনসিটি কীভাবে সামলাতে হয় এবং অ্যান্ড্রয়েড কীভাবে আপনার বিটম্যাপগুলিকে বর্তমান ডেনসিটির সাথে মানানসই করার জন্য স্কেল করতে পারে, সে সম্পর্কে আরও তথ্যের জন্য, স্ক্রিন সামঞ্জস্যতার সংক্ষিপ্ত বিবরণ দেখুন।

টাচস্ক্রিন টাইপ notouch
finger
  • notouch : ডিভাইসটিতে টাচস্ক্রিন নেই।
  • finger : ডিভাইসটিতে একটি টাচস্ক্রিন রয়েছে যা ব্যবহারকারীর আঙুলের সরাসরি স্পর্শের মাধ্যমে ব্যবহারের জন্য তৈরি।

এছাড়াও touchscreen কনফিগারেশন ফিল্ডটি দেখুন, যা ডিভাইসটির টাচস্ক্রিনের ধরন নির্দেশ করে।

কিবোর্ডের প্রাপ্যতা keysexposed
keyshidden
keyssoft
  • keysexposed : ডিভাইসে একটি কীবোর্ড উপলব্ধ আছে। যদি ডিভাইসটিতে একটি সফটওয়্যার কীবোর্ড সক্রিয় করা থাকে (যা হওয়ার সম্ভাবনাই বেশি), তবে হার্ডওয়্যার কীবোর্ড ব্যবহারকারীর কাছে উন্মুক্ত না থাকলেও বা ডিভাইসটিতে কোনো হার্ডওয়্যার কীবোর্ড না থাকলেও এটি ব্যবহৃত হয়। যদি কোনো সফটওয়্যার কীবোর্ড সরবরাহ করা না থাকে বা এটি নিষ্ক্রিয় করা থাকে, তবে এটি শুধুমাত্র তখনই ব্যবহৃত হয় যখন একটি হার্ডওয়্যার কীবোর্ড উন্মুক্ত করা হয়।
  • keyshidden : ডিভাইসটিতে একটি হার্ডওয়্যার কীবোর্ড উপলব্ধ আছে কিন্তু সেটি লুকানো এবং ডিভাইসটিতে কোনো সফটওয়্যার কীবোর্ড সক্রিয় করা নেই
  • keyssoft : ডিভাইসটিতে একটি সফটওয়্যার কিবোর্ড সক্রিয় করা আছে, সেটি দৃশ্যমান হোক বা না হোক।

আপনি যদি keysexposed রিসোর্স প্রদান করেন, কিন্তু keyssoft রিসোর্স প্রদান না করেন, তাহলে সিস্টেমে সফটওয়্যার কীবোর্ড সক্রিয় থাকা অবস্থায়, কীবোর্ড দৃশ্যমান থাকুক বা না থাকুক, সিস্টেমটি keysexposed রিসোর্সগুলো ব্যবহার করবে।

আপনার অ্যাপের কার্যকালে ব্যবহারকারী যদি একটি হার্ডওয়্যার কিবোর্ড খোলেন, তবে এটি পরিবর্তিত হতে পারে। রানটাইমে এটি আপনার অ্যাপকে কীভাবে প্রভাবিত করে, সে সম্পর্কে তথ্যের জন্য ‘কনফিগারেশন পরিবর্তন পরিচালনা ’ দেখুন।

এছাড়াও hardKeyboardHidden এবং keyboardHidden কনফিগারেশন ফিল্ডগুলো দেখুন, যেগুলো যথাক্রমে একটি হার্ডওয়্যার কিবোর্ডের দৃশ্যমানতা এবং যেকোনো ধরনের কিবোর্ডের (সফ্টওয়্যার সহ) দৃশ্যমানতা নির্দেশ করে।

প্রাথমিক পাঠ্য ইনপুট পদ্ধতি nokeys
qwerty
12key
  • nokeys : ডিভাইসটিতে টেক্সট ইনপুটের জন্য কোনো হার্ডওয়্যার কী নেই।
  • qwerty : ডিভাইসটিতে একটি হার্ডওয়্যার QWERTY কিবোর্ড রয়েছে, তা ব্যবহারকারীর কাছে দৃশ্যমান হোক বা না হোক।
  • 12key : ডিভাইসটিতে একটি হার্ডওয়্যার ১২-কী কিবোর্ড রয়েছে, যা ব্যবহারকারীর কাছে দৃশ্যমান হোক বা না হোক।

এছাড়াও keyboard কনফিগারেশন ফিল্ডটি দেখুন, যা উপলব্ধ প্রধান টেক্সট ইনপুট পদ্ধতি নির্দেশ করে।

প্ল্যাটফর্ম সংস্করণ (এপিআই স্তর) উদাহরণ:
v3
v4
v7
ইত্যাদি।

ডিভাইস দ্বারা সমর্থিত এপিআই লেভেল। উদাহরণস্বরূপ, এপিআই লেভেল ১-এর জন্য v1 (অ্যান্ড্রয়েড ১.০ বা তার উচ্চতর সংস্করণের ডিভাইস) এবং এপিআই লেভেল ৪-এর জন্য v4 (অ্যান্ড্রয়েড ১.৬ বা তার উচ্চতর সংস্করণের ডিভাইস)। এই মানগুলো সম্পর্কে আরও তথ্যের জন্য, অ্যান্ড্রয়েড এপিআই লেভেল ডকুমেন্টটি দেখুন।

দ্রষ্টব্য: অ্যান্ড্রয়েডের সব সংস্করণ সমস্ত কোয়ালিফায়ার সমর্থন করে না। একটি নতুন কোয়ালিফায়ার ব্যবহার করলে তা স্বয়ংক্রিয়ভাবে প্ল্যাটফর্ম সংস্করণ কোয়ালিফায়ারটি যুক্ত করে দেয়, ফলে পুরোনো ডিভাইসগুলো এটিকে উপেক্ষা করতে পারে। যেকোনো সমস্যা এড়াতে, সর্বদা ডিফল্ট রিসোর্সের একটি সেট ( কোয়ালিফায়ারবিহীন রিসোর্সের একটি সেট) অন্তর্ভুক্ত করুন। আরও তথ্যের জন্য, রিসোর্সের মাধ্যমে ডিভাইসের সর্বোত্তম সামঞ্জস্যতা প্রদান সম্পর্কিত বিভাগটি দেখুন।

কম্পোজ অ্যাপে, লেআউট এবং ডাইমেনশন-সম্পর্কিত কনফিগারেশন কোয়ালিফায়ারের প্রয়োজন হয় না। যদিও এগুলোর অস্তিত্ব রয়েছে, তবুও এগুলোকে সারণি ২ থেকে বাদ দেওয়া হয়েছে। এই কোয়ালিফায়ারগুলোর মধ্যে রয়েছে: লেআউট ডিরেকশন, স্মলেস্ট উইডথ, অ্যাভেইলেবল উইডথ, অ্যাভেইলেবল হাইট, স্ক্রিন সাইজ, স্ক্রিন অ্যাসপেক্ট, রাউন্ড স্ক্রিন এবং স্ক্রিন ওরিয়েন্টেশন। অগ্রাধিকারের ক্রমানুসারে কনফিগারেশন কোয়ালিফায়ারগুলোর সম্পূর্ণ তালিকার জন্য, অ্যাপ রিসোর্সেস ওভারভিউ (ভিউস) দেখুন।

কোয়ালিফায়ার নামের নিয়মাবলী

কনফিগারেশন কোয়ালিফায়ার নাম ব্যবহারের কিছু নিয়ম নিচে দেওয়া হলো:

  • আপনি ড্যাশ দিয়ে আলাদা করে একটিমাত্র রিসোর্স সেটের জন্য একাধিক কোয়ালিফায়ার নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ, drawable-en-rUS-night ইউএস-ইংলিশ ডিভাইসগুলোর নাইট মোডের ক্ষেত্রে প্রযোজ্য।
  • যোগ্যতা নির্ধারকগুলো অবশ্যই সারণি ২- এ তালিকাভুক্ত ক্রমানুসারে থাকতে হবে।
    • ভুল: drawable-hdpi-night/
    • সঠিক: drawable-night-hdpi/
  • বিকল্প রিসোর্স ডিরেক্টরিগুলো একটির ভেতরে আরেকটি রাখা যায় না। উদাহরণস্বরূপ, res/drawable/drawable-en/ থাকতে পারে না।
  • মানগুলো কেস-ইনসেনসিটিভ। কেস-ইনসেনসিটিভ ফাইল সিস্টেমে সমস্যা এড়ানোর জন্য রিসোর্স কম্পাইলার প্রসেসিংয়ের আগে ডিরেক্টরির নামগুলোকে ছোট হাতের অক্ষরে রূপান্তর করে। নামগুলোতে বড় হাতের অক্ষর ব্যবহার করা হয় শুধুমাত্র পাঠযোগ্যতা বাড়ানোর জন্য।
  • প্রতিটি কোয়ালিফায়ার টাইপের জন্য শুধুমাত্র একটি ভ্যালু সমর্থিত। উদাহরণস্বরূপ, আপনি যদি স্পেন এবং ফ্রান্সের জন্য একই ড্রয়েবল ফাইল ব্যবহার করতে চান, তাহলে আপনি drawable-es-fr/ ` নামের কোনো ডিরেক্টরি রাখতে পারবেন না । এর পরিবর্তে, আপনার drawable-es/ এবং drawable-fr/ -এর মতো দুটি রিসোর্স ডিরেক্টরি প্রয়োজন, যেগুলোতে উপযুক্ত ফাইলগুলো থাকবে।

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

যদি কোনো নির্দিষ্ট ডিভাইস কনফিগারেশনের সাথে মেলে এমন কোনো বিকল্প রিসোর্স না থাকে, তাহলে অ্যান্ড্রয়েড সংশ্লিষ্ট ডিফল্ট রিসোর্সগুলো ব্যবহার করে—যা হলো একটি নির্দিষ্ট রিসোর্স টাইপের জন্য রিসোর্সের সেই সেট, যেগুলোতে কোনো কনফিগারেশন কোয়ালিফায়ার অন্তর্ভুক্ত থাকে না।

উপনাম সম্পদ তৈরি করুন

যখন আপনার কাছে এমন কোনো রিসোর্স থাকে যা আপনি একাধিক ডিভাইস কনফিগারেশনের জন্য ব্যবহার করতে চান কিন্তু সেটিকে ডিফল্ট রিসোর্স হিসেবে প্রদান করতে চান না, তখন একই রিসোর্স একাধিক বিকল্প রিসোর্স ডিরেক্টরিতে রাখার প্রয়োজন নেই। এর পরিবর্তে, আপনি একটি বিকল্প রিসোর্স তৈরি করতে পারেন যা আপনার ডিফল্ট রিসোর্স ডিরেক্টরিতে সংরক্ষিত কোনো রিসোর্সের অ্যালিয়াস (alias) হিসেবে কাজ করবে।

অঙ্কনযোগ্য

উদাহরণস্বরূপ, ধরুন আপনার কাছে icon.png একটি অ্যাপ আইকন আছে এবং বিভিন্ন লোকেলের জন্য এটির একটি স্বতন্ত্র সংস্করণ প্রয়োজন। কিন্তু, ইংলিশ-কানাডিয়ান এবং ফ্রেঞ্চ-কানাডিয়ান—এই দুটি লোকেলের জন্য একই সংস্করণ ব্যবহার করতে হবে। ইংলিশ-কানাডিয়ান এবং ফ্রেঞ্চ-কানাডিয়ান উভয়ের জন্য একই ইমেজ রিসোর্স ডিরেক্টরিতে কপি করার কোনো প্রয়োজন নেই। এর পরিবর্তে, আপনি উভয়ের জন্য ব্যবহৃত ইমেজটি icon.png ছাড়া অন্য যেকোনো নামে, যেমন icon_ca.png , সেভ করে ডিফল্ট res/drawable/ ডিরেক্টরিতে রাখতে পারেন। এরপর res/drawable-en-rCA/ এবং res/drawable-fr-rCA/ ফোল্ডারে একটি icon.xml ফাইল তৈরি করুন, যেখানে <bitmap> এলিমেন্ট ব্যবহার করে icon_ca.png রিসোর্সটিকে রেফার করা থাকবে।

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon_ca" />

এর মাধ্যমে আপনি PNG ফাইলের কেবল একটি সংস্করণ এবং সেটিকে নির্দেশকারী দুটি ছোট XML ফাইল সংরক্ষণ করতে পারবেন। এরপর আপনি painterResource(R.drawable.icon) ব্যবহার করতে পারবেন এবং সিস্টেমটি লোকেল শনাক্ত করার পর উপযুক্ত ফাইলটি বেছে নেবে।

স্ট্রিং এবং অন্যান্য সাধারণ মান

বিদ্যমান কোনো স্ট্রিং-এর অ্যালিয়াস তৈরি করতে, নতুন স্ট্রিংটির ভ্যালু হিসেবে কাঙ্ক্ষিত স্ট্রিংটির রিসোর্স আইডি ব্যবহার করুন:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello</string>
    <string name="hi">@string/hello</string>
</resources>

R.string.hi রিসোর্সটি এখন R.string.hello এর একটি উপনাম (alias)।

অন্যান্য সাধারণ মানগুলোও একইভাবে কাজ করে, যেমন রং:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="red">#f00</color>
    <color name="highlight">@color/red</color>
</resources>

আপনার অ্যাপের রিসোর্স অ্যাক্সেস করুন

আপনার অ্যাপ্লিকেশনে একবার কোনো রিসোর্স প্রদান করলে, আপনি তার রিসোর্স আইডি উল্লেখ করে সেটি প্রয়োগ করতে পারেন। সমস্ত রিসোর্স আইডি আপনার প্রোজেক্টের R ক্লাসে সংজ্ঞায়িত করা থাকে, যা aapt টুলটি স্বয়ংক্রিয়ভাবে তৈরি করে।

যখন আপনার অ্যাপ্লিকেশনটি কম্পাইল করা হয়, aapt একটি R ক্লাস তৈরি করে, যেটিতে আপনার res/ ডিরেক্টরিতে থাকা সমস্ত রিসোর্সের রিসোর্স আইডি থাকে। প্রতিটি ধরণের রিসোর্সের জন্য একটি R সাবক্লাস থাকে, যেমন সমস্ত ড্রয়েবল রিসোর্সের জন্য R.drawable । এবং সেই ধরণের প্রতিটি রিসোর্সের জন্য একটি স্ট্যাটিক ইন্টিজার থাকে, উদাহরণস্বরূপ, R.drawable.icon । এই ইন্টিজারটিই হলো রিসোর্স আইডি, যা ব্যবহার করে আপনি আপনার রিসোর্সটি খুঁজে পেতে পারেন।

যদিও R ক্লাসেই রিসোর্স আইডি নির্দিষ্ট করা থাকে, একটি রিসোর্স আইডি খুঁজে বের করার জন্য সেখানে দেখার প্রয়োজন নেই। একটি রিসোর্স আইডি সর্বদা নিম্নলিখিত উপাদানগুলো দিয়ে গঠিত হয়:

  • রিসোর্সের ধরণ : প্রতিটি রিসোর্সকে একটি 'ধরণ'-এ ভাগ করা হয়, যেমন string বা drawable
  • রিসোর্স নেম হলো ফাইলের নাম, যা থেকে এক্সটেনশনটি বাদ দেওয়া হয়।

কম্পোজে রিসোর্স অ্যাক্সেস করুন

Jetpack Compose নিরাপদে রিসোর্স অ্যাক্সেস করার জন্য বিল্ট-ইন, কম্পোজেবল-অ্যাওয়্যার ফাংশন প্রদান করে।

  • স্ট্রিং:
    stringResource(id = R.string.hello)
  • অঙ্কনযোগ্য:
    painterResource(id = R.drawable.my_icon)

নন-ইউআই কোডে রিসোর্স অ্যাক্সেস করুন

আপনার UI হায়ারার্কির বাইরের কোনো রিসোর্স—যেমন ViewModel , Repository বা সিস্টেম Service —অ্যাক্সেস করার প্রয়োজন হলে, আপনি Context ব্যবহার করে সেগুলোকে রিজলভ করতে পারেন।

// Retrieve a localized string resource
val greeting = context.getString(R.string.hello_world)

আপনি Resources এর মেথড ব্যবহার করে স্বতন্ত্র রিসোর্সও পুনরুদ্ধার করতে পারেন, যার একটি ইনস্ট্যান্স আপনি getResources এর মাধ্যমে পেতে পারেন।

সিনট্যাক্স

কোডে কোনো রিসোর্স রেফারেন্স করার সিনট্যাক্সটি হলো:

[<package_name>.]R.<resource_type>.<resource_name>
  • <package_name> হলো সেই প্যাকেজের নাম যেখানে রিসোর্সটি অবস্থিত (নিজের প্যাকেজ থেকে রিসোর্স রেফারেন্স করার ক্ষেত্রে এটির প্রয়োজন নেই)।
  • <resource_type> হলো রিসোর্স টাইপের জন্য R সাবক্লাস।
  • <resource_name> হলো এক্সটেনশন ছাড়া রিসোর্স ফাইলের নাম অথবা সহজ মানের জন্য XML এলিমেন্টের android:name অ্যাট্রিবিউটের মান।

প্রতিটি রিসোর্স টাইপ এবং সেগুলোকে কীভাবে রেফারেন্স করতে হয় সে সম্পর্কে আরও তথ্যের জন্য, Compose-এর রিসোর্সসমূহ (Resources in Compose ) দেখুন।

মূল ফাইলগুলি অ্যাক্সেস করুন

যদিও এটি অস্বাভাবিক, আপনার মূল ফাইল এবং ডিরেক্টরিগুলো অ্যাক্সেস করার প্রয়োজন হতে পারে। যদি এমনটা হয়, তাহলে res/ ফোল্ডারে আপনার ফাইলগুলো সেভ করলে কাজ হবে না, কারণ res/ থেকে কোনো রিসোর্স পড়ার একমাত্র উপায় হলো রিসোর্স আইডি ব্যবহার করা। এর পরিবর্তে, আপনি আপনার রিসোর্সগুলো assets/ ডিরেক্টরিতে সেভ করতে পারেন।

assets/ ডিরেক্টরিতে সংরক্ষিত ফাইলগুলোকে কোনো রিসোর্স আইডি দেওয়া হয় না , তাই আপনি R ক্লাস বা XML রিসোর্স থেকে সেগুলোকে রেফারেন্স করতে পারবেন না। এর পরিবর্তে, আপনি একটি সাধারণ ফাইল সিস্টেমের মতো assets/ ডিরেক্টরির ফাইলগুলো কোয়েরি করতে পারেন এবং AssetManager ব্যবহার করে র ডেটা পড়তে পারেন।

তবে, আপনার যদি শুধু র ডেটা (যেমন একটি ভিডিও বা অডিও ফাইল) পড়ার ক্ষমতা প্রয়োজন হয়, তাহলে ফাইলটি res/raw/ ডিরেক্টরিতে সংরক্ষণ করুন এবং openRawResource ব্যবহার করে বাইটের একটি স্ট্রিম পড়ুন।

প্ল্যাটফর্মের রিসোর্স অ্যাক্সেস করুন

অ্যান্ড্রয়েডে সিস্টেম স্টাইল এবং থিমের মতো বেশ কিছু স্ট্যান্ডার্ড রিসোর্স রয়েছে। এগুলো অ্যাক্সেস করতে, আপনার রিসোর্স রেফারেন্সটিকে android প্যাকেজ ক্লাস দিয়ে কোয়ালিফাই করুন। উদাহরণস্বরূপ: painterResource(android.R.drawable.ic_menu_info_details)

রিসোর্সগুলোর সাথে ডিভাইসের সর্বোত্তম সামঞ্জস্য প্রদান করুন।

আপনার অ্যাপ যাতে একাধিক ডিভাইস কনফিগারেশন সমর্থন করতে পারে, সেজন্য আপনার অ্যাপে ব্যবহৃত প্রতিটি ধরনের রিসোর্সের জন্য সর্বদা ডিফল্ট রিসোর্স সরবরাহ করা অত্যন্ত গুরুত্বপূর্ণ।

উদাহরণস্বরূপ, যদি আপনার অ্যাপ একাধিক ভাষা সমর্থন করে, তাহলে সর্বদা একটি values/ ' ডিরেক্টরি (যেখানে আপনার স্ট্রিংগুলো সংরক্ষিত থাকে) ভাষা এবং অঞ্চল কোয়ালিফায়ার ছাড়া অন্তর্ভুক্ত করুন। এর পরিবর্তে, আপনি যদি আপনার সমস্ত স্ট্রিং ফাইল এমন ডিরেক্টরিতে রাখেন যেখানে ভাষা এবং অঞ্চল কোয়ালিফায়ার আছে, তাহলে আপনার স্ট্রিংগুলো যে ভাষা সমর্থন করে না, সেই ভাষায় সেট করা কোনো ডিভাইসে অ্যাপটি চালালে তা ক্র্যাশ করবে।

যতক্ষণ আপনি ডিফল্ট values/ রিসোর্স সরবরাহ করবেন, ততক্ষণ আপনার অ্যাপটি সঠিকভাবে চলবে, এমনকি ব্যবহারকারী এর ভাষা না বুঝলেও। ক্র্যাশ করার চেয়ে এটা ভালো।

ডিফল্ট রিসোর্স প্রদান করা গুরুত্বপূর্ণ, শুধু এই কারণে নয় যে আপনার অ্যাপ এমন কোনো কনফিগারেশনে চলতে পারে যা আপনি আগে থেকে ভাবেননি, বরং এই কারণেও যে অ্যান্ড্রয়েডের নতুন সংস্করণগুলো মাঝে মাঝে এমন কনফিগারেশন কোয়ালিফায়ার যোগ করে যা পূর্ববর্তী সংস্করণগুলো সমর্থন করে না। আপনি যদি একটি নতুন রিসোর্স কোয়ালিফায়ার ব্যবহার করেন, কিন্তু অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলোর সাথে কোডের সামঞ্জস্যতা বজায় রাখতে চান, তাহলে অ্যান্ড্রয়েডের কোনো পূর্ববর্তী সংস্করণ যখন আপনার অ্যাপটি চালাবে, তখন ডিফল্ট রিসোর্স প্রদান না করলে অ্যাপটি ক্র্যাশ করবে, কারণ এটি নতুন কোয়ালিফায়ার দ্বারা চিহ্নিত রিসোর্সগুলো ব্যবহার করতে পারে না।

উদাহরণস্বরূপ, যদি আপনার minSdkVersion 4-এ সেট করা থাকে, এবং আপনি আপনার সমস্ত ড্রয়েবল রিসোর্সকে নাইট মোড ( night বা notnight , যা API লেভেল 8-এ যোগ করা হয়েছিল) ব্যবহার করে কোয়ালিফাই করেন, তাহলে একটি API লেভেল 4 ডিভাইস আপনার ড্রয়েবল রিসোর্সগুলো অ্যাক্সেস করতে পারবে না এবং ক্র্যাশ করবে। এই ক্ষেত্রে, আপনি সম্ভবত notnight আপনার ডিফল্ট রিসোর্স হিসেবে রাখতে চাইবেন, তাই ওই কোয়ালিফায়ারটি বাদ দিন এবং আপনার ড্রয়েবল রিসোর্সগুলোকে drawable/ অথবা drawable-night/ ফোল্ডারে রাখুন।

সংক্ষেপে, ডিভাইসের সাথে সর্বোত্তম সামঞ্জস্যতা নিশ্চিত করতে, আপনার অ্যাপের সঠিকভাবে কাজ করার জন্য প্রয়োজনীয় রিসোর্সগুলোর জন্য সর্বদা ডিফল্ট রিসোর্স সরবরাহ করুন। এরপর, কনফিগারেশন কোয়ালিফায়ার ব্যবহার করে নির্দিষ্ট ডিভাইস কনফিগারেশনের জন্য বিকল্প রিসোর্স তৈরি করুন।

এই নিয়মের একটি ব্যতিক্রম আছে: যদি আপনার অ্যাপের minSdkVersion ৪ বা তার বেশি হয়, তাহলে স্ক্রিন ডেনসিটি কোয়ালিফায়ারের সাথে বিকল্প ড্রয়েবল রিসোর্স প্রদান করলে আপনার ডিফল্ট ড্রয়েবল রিসোর্সের প্রয়োজন নেই । ডিফল্ট ড্রয়েবল রিসোর্স ছাড়াও, অ্যান্ড্রয়েড বিকল্প স্ক্রিন ডেনসিটিগুলোর মধ্যে থেকে সেরা মিল খুঁজে নিতে পারে এবং প্রয়োজন অনুযায়ী বিটম্যাপগুলোকে স্কেল করতে পারে। তবে, সব ধরনের ডিভাইসে সেরা অভিজ্ঞতার জন্য, তিন ধরনের ডেনসিটির জন্যই বিকল্প ড্রয়েবল প্রদান করুন।

অ্যান্ড্রয়েড কীভাবে সবচেয়ে উপযুক্ত রিসোর্স খুঁজে বের করে

যখন আপনি এমন কোনো রিসোর্সের জন্য অনুরোধ করেন যার বিকল্প আপনি প্রদান করেন, তখন অ্যান্ড্রয়েড বর্তমান ডিভাইস কনফিগারেশনের উপর নির্ভর করে রানটাইমে কোন বিকল্প রিসোর্সটি ব্যবহার করা হবে তা নির্বাচন করে। অ্যান্ড্রয়েড কীভাবে একটি বিকল্প রিসোর্স নির্বাচন করে তা দেখানোর জন্য, ধরে নিন নিম্নলিখিত ড্রয়েবল ডিরেক্টরিগুলোর প্রতিটিতে একই ইমেজের বিভিন্ন সংস্করণ রয়েছে:

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-night/
drawable-en-notouch-12key/
drawable-night-ldpi/
drawable-night-notouch-12key/

এবং ধরে নিন ডিভাইসটির কনফিগারেশন নিম্নরূপ:

লোকেল = en-GB
নাইট মোড = night
স্ক্রিন পিক্সেল ঘনত্ব = hdpi
টাচস্ক্রিন টাইপ = notouch
প্রাথমিক টেক্সট ইনপুট পদ্ধতি = 12key

ডিভাইস কনফিগারেশনকে উপলব্ধ বিকল্প রিসোর্সগুলোর সাথে তুলনা করে অ্যান্ড্রয়েড drawable-en-night থেকে ড্রয়েবল নির্বাচন করে।

সিস্টেমটি কোন সম্পদ ব্যবহার করবে সেই সিদ্ধান্তে নিম্নলিখিত যুক্তির মাধ্যমে উপনীত হয়:

চিত্র ২. অ্যান্ড্রয়েড কীভাবে সবচেয়ে উপযুক্ত রিসোর্স খুঁজে বের করে তার ফ্লোচার্ট।

  1. ডিভাইস কনফিগারেশনের সাথে সাংঘর্ষিক রিসোর্স ফাইলগুলো মুছে ফেলুন।

    drawable-fr-rCA/ ডিরেক্টরিটি বাদ দেওয়া হয়েছে, কারণ এটি en-GB লোকেল-এর সাথে সাংঘর্ষিক।

    drawable/
    drawable-en/
    drawable-fr-rCA/
    drawable-en-night/
    drawable-en-notouch-12key/
    drawable-night-ldpi/
    drawable-night-notouch-12key/
    

    ব্যতিক্রম: স্ক্রিন পিক্সেল ডেনসিটি হলো একমাত্র কোয়ালিফায়ার যা কোনো অসঙ্গতির কারণে বাদ দেওয়া হয় না। যদিও ডিভাইসটির স্ক্রিন ডেনসিটি hdpi, drawable-night-ldpi/ বাদ দেওয়া হয় না, কারণ এই পর্যায়ে প্রতিটি স্ক্রিন ডেনসিটিকেই সামঞ্জস্যপূর্ণ বলে বিবেচনা করা হয়। তথ্যের জন্য, স্ক্রিন সামঞ্জস্যতার ওভারভিউ দেখুন।

  2. তালিকা থেকে পরবর্তী সর্বোচ্চ অগ্রাধিকারের কোয়ালিফায়ারটি খুঁজুন ( সারণী ২ )। (MCC দিয়ে শুরু করুন।)
  3. রিসোর্স ডিরেক্টরিগুলোর কোনোটিতে কি এই কোয়ালিফায়ারটি অন্তর্ভুক্ত আছে?
    • যদি উত্তর 'না' হয়, তবে দ্বিতীয় ধাপে ফিরে যান এবং পরবর্তী কোয়ালিফায়ারটি দেখুন। এই উদাহরণে, ল্যাঙ্গুয়েজ কোয়ালিফায়ারে না পৌঁছানো পর্যন্ত উত্তরটি 'না' হবে।
    • যদি উত্তর হ্যাঁ হয়, তবে চতুর্থ ধাপে যান।
  4. যেসব রিসোর্স ডিরেক্টরিতে এই কোয়ালিফায়ারটি নেই, সেগুলোকে বাদ দিন। এই উদাহরণে, সিস্টেমটি এরপর সেই সমস্ত ডিরেক্টরি বাদ দেয় যেগুলিতে কোনো ল্যাঙ্গুয়েজ কোয়ালিফায়ার নেই:
    drawable/
    drawable-en/
    drawable-en-night/
    drawable-en-notouch-12key/
    drawable-night-ldpi/
    drawable-night-notouch-12key/
    

    ব্যতিক্রম: যদি বিবেচ্য কোয়ালিফায়ারটি স্ক্রিন পিক্সেল ডেনসিটি হয়, তাহলে অ্যান্ড্রয়েড সেই অপশনটি বেছে নেয় যা ডিভাইসের স্ক্রিন ডেনসিটির সাথে সবচেয়ে বেশি মেলে। সাধারণত, অ্যান্ড্রয়েড একটি ছোট মূল ইমেজকে বড় করার চেয়ে একটি বড় মূল ইমেজকে ছোট করতে বেশি পছন্দ করে। আরও তথ্যের জন্য, স্ক্রিন কম্প্যাটিবিলিটি ওভারভিউ দেখুন।

  5. কেবলমাত্র একটি ডিরেক্টরি অবশিষ্ট না থাকা পর্যন্ত দুই, তিন এবং চার নম্বর ধাপগুলো পুনরাবৃত্তি করুন। এই উদাহরণে, নাইট মোড হলো পরবর্তী কোয়ালিফায়ার যার জন্য কোনো মিল পাওয়া গেছে। সুতরাং, যে রিসোর্সগুলোতে নাইট মোড নির্দিষ্ট করা নেই, সেগুলো বাদ দেওয়া হয়:
    drawable-en/
    drawable-en-night/
    drawable-en-notouch-12key/
    

    অবশিষ্ট ডিরেক্টরিটি হলো drawable-en-night

যদিও অনুরোধ করা প্রতিটি রিসোর্সের জন্য এই পদ্ধতিটি কার্যকর করা হয়, সিস্টেমটি এর কিছু দিক অপ্টিমাইজ করে। এই ধরনের একটি অপ্টিমাইজেশন হলো, ডিভাইসের কনফিগারেশন জানা গেলে, এটি এমন বিকল্প রিসোর্সগুলোকে বাদ দিয়ে দিতে পারে যেগুলো কখনোই মিলবে না। উদাহরণস্বরূপ, যদি কনফিগারেশনের ভাষা ইংরেজি হয়, তাহলে যে রিসোর্স ডিরেক্টরির ল্যাঙ্গুয়েজ কোয়ালিফায়ার ইংরেজি ছাড়া অন্য কিছুতে সেট করা আছে, সেটিকে যাচাই করা রিসোর্সের তালিকায় কখনোই অন্তর্ভুক্ত করা হয় না (যদিও ল্যাঙ্গুয়েজ কোয়ালিফায়ার ছাড়া রিসোর্স ডিরেক্টরি ঠিকই অন্তর্ভুক্ত থাকে)।

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

তবে, যদি একমাত্র উপলব্ধ রিসোর্সগুলো বর্তমান স্ক্রিনের চেয়ে বড় হয়, তাহলে সিস্টেম সেগুলো ব্যবহার করে না এবং ডিভাইস কনফিগারেশনের সাথে মেলে এমন অন্য কোনো রিসোর্স না থাকলে আপনার অ্যাপ ক্র্যাশ করে। উদাহরণস্বরূপ, এমনটা ঘটে যদি সমস্ত লেআউট রিসোর্সকে xlarge কোয়ালিফায়ার দিয়ে ট্যাগ করা থাকে, কিন্তু ডিভাইসটি একটি স্বাভাবিক আকারের স্ক্রিন হয়।

দ্রষ্টব্য: ডিভাইসের সাথে হুবহু মিলে যাওয়া কোয়ালিফায়ারের সংখ্যার চেয়ে কোয়ালিফায়ারের অগ্রাধিকার ( টেবিল ২-এ ) বেশি গুরুত্বপূর্ণ। পূর্ববর্তী উদাহরণে, চতুর্থ ধাপে তালিকার শেষ বিকল্পটিতে তিনটি কোয়ালিফায়ার রয়েছে যা ডিভাইসের সাথে হুবহু মিলে যায় (নাইট মোড, টাচস্ক্রিন টাইপ, এবং ইনপুট মেথড), যেখানে drawable-en কেবল একটি প্যারামিটার মেলে (ভাষা)। তবে, এই অন্যান্য কোয়ালিফায়ারগুলোর চেয়ে 'ভাষা'-র অগ্রাধিকার বেশি, তাই drawable-night-notouch-12key বাদ দেওয়া হয়।

অতিরিক্ত সম্পদ

অ্যাপের রিসোর্স সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্সগুলো দেখুন:

ডকুমেন্টেশন

বিষয়বস্তু দেখুন