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

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

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

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

গ্রুপ রিসোর্সের ধরন

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

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

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

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

টেবিল ১. প্রোজেক্ট res/ ডিরেক্টরির মধ্যে রিসোর্স ডিরেক্টরি কাজ করে।

ডিরেক্টরি রিসোর্সের ধরন
drawable/

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

  • বিটম্যাপ ফাইল
  • নাইন-প্যাচ (সাইজ পরিবর্তন করা যায় এমন বিটম্যাপ)
  • রাজ্যের তালিকা
  • আকার
  • অ্যানিমেশন ড্রয়েবল
  • অন্যান্য ড্রয়েবল

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

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

র ফর্ম্যাটে সেভ করার জন্য ইচ্ছামতো ফাইল। রিসোর্স আইডি R.raw.filename ব্যবহার করে Resources.openRawResource কল করে, InputStream-এর মাধ্যমে এইসব রিসোর্স খুলুন।

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

values/

XML ফাইলে স্ট্রিং, ইন্টিজার ও রঙের মতো সাধারণ ভ্যালু থাকে।

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

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

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

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

সতর্কতা: রিসোর্স ফাইল সরাসরি res/ ডিরেক্টরির মধ্যে কখনও সেভ করবেন না। এর ফলে কম্পাইলার সংক্রান্ত সমস্যা হয়।

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

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

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

বিকল্প রিসোর্স প্রদান করুন

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

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

  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 ছবি রেফারেন্স করার জন্য আপনি যে রিসোর্স আইডি ব্যবহার করেন তা সবসময় একই থাকে। রিসোর্স ডিরেক্টরির নামের কোয়ালিফায়ারের সাথে ডিভাইস কনফিগারেশন সংক্রান্ত তথ্য তুলনা করে, Android প্রতিটি রিসোর্সের সেই ভার্সন বেছে নেয় যা বর্তমান ডিভাইসের সাথে সবচেয়ে ভালোভাবে মানানসই হয়।

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

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

টেবিল ২. কনফিগারেশন কোয়ালিফায়ার নাম।

কনফিগারেশন কোয়ালিফায়ার ভ্যালু বর্ণনা
MCC এবং MNC উদাহরণ:
mcc310
mcc310-mnc004
mcc208-mnc00

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

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

এছাড়াও, আপনি শুধু 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 প্রিফিক্স অঞ্চলের অংশ আলাদা করতে ব্যবহার করা হয়। আপনি শুধু কোনও অঞ্চল উল্লেখ করতে পারবেন না।

Android 7.0 (API লেভেল 24) ভার্সনে BCP 47 ভাষা ট্যাগ-এর জন্য সহায়তা চালু করা হয়েছে, যা আপনি ভাষা ও অঞ্চল-নির্দিষ্ট রিসোর্স কোয়ালিফাই করতে ব্যবহার করতে পারবেন। একটি ভাষা ট্যাগ এক বা একাধিক সাবট্যাগের ক্রম থেকে গঠিত হয়, যার প্রতিটি সামগ্রিক ট্যাগ দ্বারা চিহ্নিত ভাষার পরিসরকে পরিমার্জিত বা সংকুচিত করে। ভাষা ট্যাগ সম্পর্কে আরও তথ্যের জন্য, ভাষা শনাক্ত করার জন্য ট্যাগ দেখুন।

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 কনফিগারেশন পদ্ধতি দেখুন, যা ব্যাকরণগত লিঙ্গ নির্দেশ করে।

API লেভেল ৩৪-এ যোগ করা হয়েছে।

ওয়াইড কালার গ্যামাট widecg
nowidecg
  • widecg: Display P3 বা AdobeRGB-এর মতো ওয়াইড কালার গ্যামাট সহ ডিসপ্লে
  • nowidecg: sRGB-এর মতো সংকীর্ণ কালার গ্যামাট সহ ডিসপ্লে

API লেভেল ২৬-এ যোগ করা হয়েছে।

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

উচ্চ মাত্রার ডায়নামিক ব্যাপ্তি (HDR) highdr
lowdr
  • highdr: উচ্চ মাত্রার ডায়নামিক ব্যাপ্তি সহ ডিসপ্লে
  • lowdr: কম/স্ট্যান্ডার্ড ডায়নামিক রেঞ্জ সহ ডিসপ্লে

API লেভেল ২৬-এ যোগ করা হয়েছে।

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

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

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

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

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

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

API লেভেল ৮-এ যোগ করা হয়েছে।

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

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

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

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

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

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

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

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

আপনি যদি keysexposed রিসোর্স প্রদান করেন, কিন্তু keyssoft রিসোর্স না দেন, তাহলে সিস্টেম keysexposed রিসোর্স ব্যবহার করে, কীবোর্ড দেখা যাক বা না যাক, যতক্ষণ না সিস্টেমের একটি সফ্টওয়্যার কীবোর্ড চালু থাকে।

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

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

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

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

প্ল্যাটফর্ম ভার্সন (API লেভেল) উদাহরণ:
v3
v4
v7
ইত্যাদি।

ডিভাইসে কাজ করে এমন API লেভেল। যেমন, API লেভেল ১-এর জন্য v1 (Android 1.0 বা তার পরবর্তী ভার্সন থাকা ডিভাইস) এবং API লেভেল ৪-এর জন্য v4 (Android 1.6 বা তার পরবর্তী ভার্সন থাকা ডিভাইস)। এইসব ভ্যালু সম্পর্কে আরও জানতে, Android API লেভেল ডকুমেন্ট দেখুন।

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

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

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

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

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

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

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

অ্যালিয়াস রিসোর্স তৈরি করুন

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

Drawables

যেমন, ধরুন আপনার কাছে একটি অ্যাপ আইকন, 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-এর জন্য একটি উপনাম।

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

<?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।
  • রিসোর্সের নাম, যা এক্সটেনশন বাদ দিয়ে ফাইলের নাম।

Compose-এ রিসোর্স অ্যাক্সেস করা

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

  • স্ট্রিং:
    stringResource(id = R.string.hello)
  • Drawables:
    painterResource(id = R.drawable.my_icon)

নন-UI কোডে রিসোর্স অ্যাক্সেস করা

আপনার 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-এ রিসোর্স দেখুন।

আসল ফাইল অ্যাক্সেস করুন

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

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

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

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

Android-এ সিস্টেম স্টাইল ও থিমের মতো অনেক স্ট্যান্ডার্ড রিসোর্স থাকে। এগুলি অ্যাক্সেস করতে, android প্যাকেজ ক্লাসের সাথে আপনার রিসোর্স রেফারেন্স কোয়ালিফাই করুন। যেমন: painterResource(android.R.drawable.ic_menu_info_details).

রিসোর্সের সাথে ডিভাইসের সেরা কম্প্যাটিবিলিটি প্রদান করা

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

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

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

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

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

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

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

Android কীভাবে সবচেয়ে মানানসই রিসোর্স খুঁজে পায়

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

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

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

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

ছবি ২. Android কীভাবে সবচেয়ে ভালভাবে মিলে যাওয়া রিসোর্স খুঁজে পায় তার ফ্লোচার্ট।

  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/
    

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

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

    বাকি ডিরেক্টরি হল drawable-en-night।

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

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

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

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

অতিরিক্ত রিসোর্স

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

ডকুমেন্টেশন

কন্টেন্ট দেখে