অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টালস 01.3: চিত্র সংস্থান এবং সামঞ্জস্য

এই কোডল্যাবটি Android Kotlin Fundamentals কোর্সের অংশ। আপনি যদি কোডল্যাবগুলি ক্রমানুসারে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।

ভূমিকা

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

আপনি ইতিমধ্যে কি জানা উচিত

  • কীভাবে একটি নতুন অ্যাপ প্রকল্প তৈরি করবেন এবং একটি এমুলেটর বা একটি শারীরিক ডিভাইসে একটি অ্যাপ চালাবেন।
  • রিসোর্স ( res ) ডিরেক্টরি এবং Gradle বিল্ড ফাইল সহ একটি অ্যাপ প্রকল্পের মৌলিক উপাদান।
  • অ্যাপের লেআউট ফাইল কিভাবে এডিট করবেন।
  • আপনার অ্যাপের কোডে ভিউ অবজেক্টগুলি কীভাবে সন্ধান করবেন এবং সংশোধন করবেন।

আপনি কি শিখবেন

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

আপনি কি করবেন

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

এই কোডল্যাবে, আপনি আগের কোডল্যাবে শুরু করা DiceRoller অ্যাপে তৈরি করেন এবং ডাই রোল করার সময় পরিবর্তন হয়ে যায় এমন ডাইস ইমেজ যোগ করেন। চূড়ান্ত DiceRoller অ্যাপ্লিকেশন এই মত দেখায়:

আপনি যদি শেষ কোডল্যাবের মাধ্যমে কাজ না করে থাকেন তবে আপনি শুরুর অ্যাপটি এখানে ডাউনলোড করতে পারেন: DiceRoller

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

ধাপ 1: ছবি যোগ করুন

  1. অ্যান্ড্রয়েড স্টুডিওতে DiceRoller অ্যাপ প্রকল্পটি খুলুন যদি এটি ইতিমধ্যে খোলা না থাকে। আপনি যদি শেষ কোডল্যাবের মাধ্যমে কাজ না করে থাকেন তবে আপনি এখানে অ্যাপটি ডাউনলোড করতে পারেন: DiceRoller
  2. প্রজেক্ট > অ্যান্ড্রয়েড ভিউতে, রেস ফোল্ডারটি প্রসারিত করুন এবং তারপর অঙ্কনযোগ্য প্রসারিত করুন।



    আপনার অ্যাপটি ছবি এবং আইকন, রঙ, স্ট্রিং এবং XML লেআউট সহ অনেকগুলি বিভিন্ন সংস্থান ব্যবহার করে৷ এই সমস্ত সংস্থান res ফোল্ডারে সংরক্ষণ করা হয়। drawable ফোল্ডারটি যেখানে আপনার অ্যাপের জন্য সমস্ত চিত্র সংস্থান রাখা উচিত। ইতিমধ্যেই drawable ফোল্ডারে আপনি অ্যাপের লঞ্চার আইকনগুলির জন্য সংস্থানগুলি খুঁজে পেতে পারেন৷
  3. ic_launcher_background.xml-এ ডাবল-ক্লিক করুন। মনে রাখবেন যে এইগুলি হল XML ফাইল যা আইকনটিকে একটি ভেক্টর চিত্র হিসাবে বর্ণনা করে। ভেক্টরগুলি আপনার ছবিগুলিকে বিভিন্ন আকার এবং রেজোলিউশনে আঁকতে সক্ষম করে। পিএনজি বা জিআইএফ-এর মতো বিটম্যাপ ছবিগুলিকে বিভিন্ন ডিভাইসের জন্য স্কেল করার প্রয়োজন হতে পারে, যার ফলে কিছু গুণমান নষ্ট হতে পারে।
  4. XML সম্পাদকের ডান কলামে প্রিভিউ ক্লিক করুন ভিজ্যুয়াল আকারে আঁকাযোগ্য ভেক্টর দেখতে।


  5. DiceImages.zip থেকে আপনার অ্যাপের জন্য ডাইস ছবি ডাউনলোড করুন। আর্কাইভ আনজিপ করুন। আপনার কাছে XML ফাইলগুলির একটি ফোল্ডার থাকা উচিত যা এইরকম দেখাচ্ছে:

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


  2. DiceRoller > app > src > main > res > drawable প্রসারিত করুন।
  3. DiceImages ফোল্ডার থেকে সমস্ত পৃথক XML ফাইল অ্যান্ড্রয়েড স্টুডিওতে এবং অঙ্কনযোগ্য ফোল্ডারে টেনে আনুন। ঠিক আছে ক্লিক করুন.
  1. প্রজেক্টটিকে আবার অ্যান্ড্রয়েড ভিউতে স্যুইচ করুন, এবং লক্ষ্য করুন যে আপনার ডাইস ইমেজ এক্সএমএল ফাইলগুলি অঙ্কনযোগ্য ফোল্ডারে রয়েছে৷
  2. ডাইস_1. dice_1.xml ডাবল-ক্লিক করুন এবং এই ছবির জন্য XML কোডটি লক্ষ্য করুন। এই ভেক্টরটি ড্রয়েবল আসলে কেমন দেখায় তার একটি পূর্বরূপ পেতে পূর্বরূপ বোতামে ক্লিক করুন।

ধাপ 2: ছবি ব্যবহার করতে লেআউট আপডেট করুন

এখন যেহেতু আপনার res/drawables ফোল্ডারে ডাইস ইমেজ ফাইল রয়েছে, আপনি আপনার অ্যাপের লেআউট এবং কোড থেকে সেই ফাইলগুলি অ্যাক্সেস করতে পারেন। এই ধাপে, আপনি ImageView TextView সংখ্যাগুলি প্রদর্শন করে।

  1. activity_main.xml main.xml লেআউট ফাইলটি খুলুন যদি এটি ইতিমধ্যে খোলা না থাকে। লেআউটের XML কোড দেখতে টেক্সট ট্যাবে ক্লিক করুন।
  2. <TextView> উপাদানটি মুছুন।
  3. এই বৈশিষ্ট্যগুলির সাথে একটি <ImageView> উপাদান যোগ করুন:
<ImageView
   android:id="@+id/dice_image"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_horizontal"
   android:src="@drawable/dice_1" />

আপনি আপনার লেআউটে একটি ছবি প্রদর্শন করতে একটি ImageView ব্যবহার করেন। এই উপাদানটির জন্য একমাত্র নতুন বৈশিষ্ট্য হল android:src , ছবির জন্য উৎস সংস্থান নির্দেশ করতে। এই ক্ষেত্রে, @drawable/dice_1 এর একটি ইমেজ সোর্স মানে অ্যান্ড্রয়েডকে dice_1 নামের ইমেজের জন্য অঙ্কনযোগ্য রিসোর্স ( res/drawable ) দেখতে হবে।

  1. লেআউটের পূর্বরূপ দেখতে পূর্বরূপ বোতামে ক্লিক করুন। এটিকে ঐটির মত দেখতে হবে:

ধাপ 3: কোড আপডেট করুন

  1. MainActivity খুলুন। rollDice() ফাংশনটি এখন পর্যন্ত কেমন দেখাচ্ছে তা এখানে:
private fun rollDice() {
   val randomInt = Random().nextInt(6) + 1

   val resultText: TextView = findViewById(R.id.result_text)
   resultText.text = randomInt.toString()
}

লক্ষ্য করুন যে R.id.result_text এর রেফারেন্স লাল রঙে হাইলাইট করা হতে পারে—এর কারণ আপনি লেআউট থেকে TextView মুছে ফেলেছেন এবং সেই ID আর বিদ্যমান নেই।

  1. ফাংশনের শেষে দুটি লাইন মুছুন যা resultText ভেরিয়েবলকে সংজ্ঞায়িত করে এবং এর পাঠ্য বৈশিষ্ট্য সেট করে। আপনি আর লেআউটে একটি TextView ব্যবহার করছেন না, তাই আপনার কোনো লাইনের প্রয়োজন নেই।
  2. ID ( R.id.dice_image ) দ্বারা লেআউটে নতুন ImageView -এর একটি রেফারেন্স পেতে findViewByID() ব্যবহার করুন এবং একটি নতুন diceImage ভেরিয়েবলে সেই ভিউ বরাদ্দ করুন:
val diceImage: ImageView = findViewById(R.id.dice_image)
  1. randomInteger এর মানের উপর ভিত্তি করে একটি নির্দিষ্ট ডাই ইমেজ বেছে নিতে when ব্লক যোগ করুন:
val drawableResource = when (randomInt) {
   1 -> R.drawable.dice_1
   2 -> R.drawable.dice_2
   3 -> R.drawable.dice_3
   4 -> R.drawable.dice_4
   5 -> R.drawable.dice_5
   else -> R.drawable.dice_6
}

আইডিগুলির মতো আপনি R ক্লাসের মানগুলির সাথে অঙ্কনযোগ্য ফোল্ডারে ডাইস চিত্রগুলি উল্লেখ করতে পারেন। এখানে R.drawable বলতে অ্যাপের আঁকাযোগ্য ফোল্ডারকে বোঝায় এবং dice_1 হল সেই ফোল্ডারের মধ্যে একটি নির্দিষ্ট ডাই ইমেজ রিসোর্স।

  1. setImageResource() পদ্ধতির সাহায্যে ImageView এর উৎস আপডেট করুন এবং আপনি এইমাত্র পাওয়া ডাই ইমেজের রেফারেন্স।
diceImage.setImageResource(drawableResource)
  1. অ্যাপটি কম্পাইল করে রান করুন। এখন আপনি যখন রোল বোতামে ক্লিক করেন, চিত্রটি উপযুক্ত চিত্রের সাথে আপডেট হওয়া উচিত।

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

এই টাস্কে, আপনি আপনার অ্যাপটিকে আরও দক্ষ করে তোলার একটি উপায় সম্পর্কে শিখবেন।

  1. MainActivity খুলুন, যদি এটি ইতিমধ্যে খোলা না থাকে। rollDice() পদ্ধতিতে, diceImage ভেরিয়েবলের জন্য ঘোষণাটি নোট করুন:
val diceImage : ImageView = findViewById(R.id.dice_image)

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

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

  1. ক্লাসের শীর্ষে, onCreate() এর আগে, ImageView ধরে রাখার জন্য একটি ক্ষেত্র তৈরি করুন।
var diceImage : ImageView? = null

আদর্শভাবে আপনি এই ভেরিয়েবলটি এখানে শুরু করবেন যখন এটি ঘোষণা করা হবে, বা একটি কনস্ট্রাক্টরে — তবে অ্যান্ড্রয়েড অ্যাক্টিভিটিগুলি কনস্ট্রাক্টর ব্যবহার করে না। প্রকৃতপক্ষে, লেআউটের দৃশ্যগুলি মেমরিতে অ্যাক্সেসযোগ্য বস্তু নয় যতক্ষণ না সেগুলি setContentView() onCreate() পদ্ধতিতে সেট কন্টেন্টভিউ() এ কল করে স্ফীত না হয়। এটি না হওয়া পর্যন্ত আপনি diceImage ভেরিয়েবলটি আরম্ভ করতে পারবেন না।

একটি বিকল্প হল diceImage ভেরিয়েবলটিকে nullable হিসাবে সংজ্ঞায়িত করা, যেমন এই উদাহরণে। যখন এটি ঘোষণা করা হয় তখন এটিকে null এ সেট করুন এবং তারপর findViewById() ) এর সাথে onCreate() এর বাস্তব ImageView এ বরাদ্দ করুন। এটি আপনার কোডকে জটিল করে তুলবে, কারণ এখন আপনি diceImage ব্যবহার করতে চান তখন আপনাকে null মান পরীক্ষা করতে হবে। একটি ভাল উপায় আছে.

  1. lateinit কীওয়ার্ড ব্যবহার করতে diceImage ঘোষণাটি পরিবর্তন করুন এবং null অ্যাসাইনমেন্টটি সরিয়ে দিন:
lateinit var diceImage : ImageView

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

  1. onCreate() এ, setContentView() পদ্ধতির পরে, ImageView পেতে findViewById() ব্যবহার করুন।
diceImage = findViewById(R.id.dice_image)
  1. rollDice() এ পুরানো লাইনটি মুছুন যা ঘোষণা করে এবং ImageView পায়। আপনি আগে ক্ষেত্র ঘোষণা দিয়ে এই লাইন প্রতিস্থাপন.
val diceImage : ImageView = findViewById(R.id.dice_image)
  1. এটি এখনও প্রত্যাশিত হিসাবে কাজ করে তা দেখতে অ্যাপটি আবার চালান।

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

  1. টেক্সট ট্যাবে activity_layout.xml খুলুন।
  2. <ImageView> উপাদানে, android:src অ্যাট্রিবিউটটিকে "@drawable/empty_dice" -এ সেট করুন :
android:src="@drawable/empty_dice" 

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

  1. ডিজাইন ট্যাবে ক্লিক করুন। ডাই ইমেজটি এখন খালি, তবে এটি প্রিভিউতেও দৃশ্যমান নয়।



    এটি মোটামুটি সাধারণ যে একটি ডিজাইনের বিষয়বস্তু রানটাইমে গতিশীলভাবে সংজ্ঞায়িত করা যেতে পারে-উদাহরণস্বরূপ, ইন্টারনেট থেকে ডেটা দখল করে এমন যেকোনো অ্যাপ সম্ভবত একটি ফাঁকা বা খালি স্ক্রীন দিয়ে শুরু করা উচিত। কিন্তু এটি সহায়ক যখন আপনি একটি অ্যাপ ডিজাইন করছেন যাতে লেআউটে কিছু ধরণের স্থানধারক ডেটা থাকে যাতে আপনি জানেন যে আপনি কী লেআউট করছেন৷
  2. activity_layout.xml এ, android:src লাইনটি অনুলিপি করুন এবং একটি দ্বিতীয় অনুলিপি পেস্ট করুন। "অ্যান্ড্রয়েড" শব্দটিকে "টুল"-এ পরিবর্তন করুন, তাই আপনার দুটি বৈশিষ্ট্য এইরকম দেখাচ্ছে:
android:src="@drawable/empty_dice" 
tools:src="@drawable/empty_dice" />

এখানে আপনি এই অ্যাট্রিবিউটের এক্সএমএল নেমস্পেস ডিফল্ট android নেমস্পেস থেকে tools নেমস্পেসে পরিবর্তন করেছেন। tools নামস্থান ব্যবহার করা হয় যখন আপনি প্লেসহোল্ডার বিষয়বস্তু সংজ্ঞায়িত করতে চান যা শুধুমাত্র পূর্বরূপ বা অ্যান্ড্রয়েড স্টুডিওতে ডিজাইন এডিটরে ব্যবহৃত হয়। আপনি যখন অ্যাপ কম্পাইল করেন তখন tools নামস্থান ব্যবহার করে বৈশিষ্ট্যগুলি সরানো হয়।

একই নামের বৈশিষ্ট্যগুলি উল্লেখ করার সময় অস্পষ্টতা সমাধানে সাহায্য করার জন্য নামস্থান ব্যবহার করা হয়। উদাহরণস্বরূপ, <ImageView> ট্যাগের এই দুটি বৈশিষ্ট্যেরই একই নাম ( src ), কিন্তু নামস্থান ভিন্ন।

  1. লেআউট ফাইলের মূলে <LinearLayout> উপাদানটি পরীক্ষা করুন এবং এখানে সংজ্ঞায়িত দুটি নামস্থান লক্ষ্য করুন।
<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   ...
  1. ImageView ট্যাগে tools:src অ্যাট্রিবিউট পরিবর্তন করুন empty_dice এর পরিবর্তে dice_1 হতে হবে:
android:src="@drawable/empty_dice" 
tools:src="@drawable/dice_1" />

লক্ষ্য করুন যে dice_1 চিত্রটি এখন প্রিভিউতে স্থানধারক চিত্র হিসাবে রয়েছে।

  1. অ্যাপটি কম্পাইল করে রান করুন। লক্ষ্য করুন যে ডাই ইমেজটি আসল অ্যাপে খালি থাকে যতক্ষণ না আপনি রোল ক্লিক বা আলতো চাপছেন

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

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

এই টাস্কে, আপনি কীভাবে নির্দিষ্ট Android API স্তরের (সংস্করণ) জন্য আপনার অ্যাপকে টার্গেট করবেন এবং পুরানো ডিভাইসগুলিকে সমর্থন করার জন্য Android Jetpack লাইব্রেরিগুলি কীভাবে ব্যবহার করবেন তা শিখবেন।

ধাপ 1: API স্তরগুলি অন্বেষণ করুন

পূর্ববর্তী কোডল্যাবে, আপনি যখন আপনার প্রকল্পটি তৈরি করেছিলেন, তখন আপনি নির্দিষ্ট Android API স্তর নির্দেশ করেছিলেন যা আপনার অ্যাপটিকে সমর্থন করা উচিত। অ্যান্ড্রয়েড ওএস-এর বিভিন্ন সংস্করণ নম্বর রয়েছে যা বর্ণানুক্রমিক ক্রমে সুস্বাদু খাবারের নামকরণ করা হয়েছে। প্রতিটি OS সংস্করণ নতুন বৈশিষ্ট্য এবং কার্যকারিতা সহ প্রেরণ করে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড ওরিও পিকচার-ইন-পিকচার অ্যাপের জন্য সমর্থন সহ পাঠানো হয়েছে, যখন অ্যান্ড্রয়েড পাই স্লাইস চালু করেছে । এপিআই স্তরগুলি অ্যান্ড্রয়েড সংস্করণগুলির সাথে মিলে যায়৷ উদাহরণস্বরূপ, API 19 Android 4.4 (KitKat) এর সাথে মিলে যায়।

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

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

  1. গ্রেডল স্ক্রিপ্ট ফোল্ডারটি প্রসারিত করুন এবং build.gradle (মডিউল: অ্যাপ) ফাইলটি খুলুন।

    এই ফাইলটি অ্যাপ মডিউলের জন্য নির্দিষ্ট বিল্ড প্যারামিটার এবং নির্ভরতা নির্ধারণ করে। build.gradle (প্রকল্প: DiceRoller) ফাইলটি সম্পূর্ণরূপে প্রকল্পের জন্য বিল্ড প্যারামিটার সংজ্ঞায়িত করে। অনেক ক্ষেত্রে, আপনার অ্যাপ মডিউলটি আপনার প্রকল্পের একমাত্র মডিউল, তাই এই বিভাজনটি নির্বিচারে মনে হতে পারে। কিন্তু যদি আপনার অ্যাপটি আরও জটিল হয়ে যায় এবং আপনি এটিকে কয়েকটি অংশে বিভক্ত করেন, অথবা যদি আপনার অ্যাপ অ্যান্ড্রয়েড ঘড়ির মতো প্ল্যাটফর্ম সমর্থন করে, তাহলে আপনি একই প্রকল্পে বিভিন্ন মডিউলের সম্মুখীন হতে পারেন।
  2. build.gradle ফাইলের উপরের দিকে android বিভাগটি পরীক্ষা করুন। (নীচের নমুনাটি সম্পূর্ণ বিভাগ নয়, তবে এই কোডল্যাবের জন্য আপনি যা সবচেয়ে বেশি আগ্রহী তা এতে রয়েছে।)
android {
   compileSdkVersion 28
   defaultConfig {
       applicationId "com.example.android.diceroller"
       minSdkVersion 19
       targetSdkVersion 28
       versionCode 1
       versionName "1.0"
   }
  1. compileSdkVersion পরামিতি পরীক্ষা করুন।
compileSdkVersion 28

এই প্যারামিটারটি Android API স্তর নির্দিষ্ট করে যা Gradle আপনার অ্যাপ কম্পাইল করতে ব্যবহার করা উচিত। এটি আপনার অ্যাপ সমর্থন করতে পারে Android এর নতুন সংস্করণ। অর্থাৎ, আপনার অ্যাপ এই এপিআই লেভেল এবং নিচের এপিআই ফিচার ব্যবহার করতে পারে। এই ক্ষেত্রে আপনার অ্যাপ API 28 সমর্থন করে, যা Android 9 (Pie) এর সাথে মিলে যায়।

  1. targetSdkVersion প্যারামিটার পরীক্ষা করুন, যা defaultConfig বিভাগের ভিতরে রয়েছে:
targetSdkVersion 28

এই মানটি হল সবচেয়ে সাম্প্রতিক API যার বিরুদ্ধে আপনি আপনার অ্যাপটি পরীক্ষা করেছেন৷ অনেক ক্ষেত্রে এটি compileSdkVersion হিসাবে একই মান।

  1. minSdkVersion পরামিতি পরীক্ষা করুন।
minSdkVersion 19

এই প্যারামিটারটি তিনটির মধ্যে সবচেয়ে গুরুত্বপূর্ণ, কারণ এটি অ্যান্ড্রয়েডের সবচেয়ে পুরানো সংস্করণ নির্ধারণ করে যেটিতে আপনার অ্যাপটি চলবে। যে ডিভাইসগুলি এই API স্তরের চেয়ে পুরানো Android OS চালায় সেগুলি আপনার অ্যাপটি মোটেও চালাতে পারে না৷

আপনার অ্যাপের জন্য ন্যূনতম API স্তর নির্বাচন করা চ্যালেঞ্জিং হতে পারে। API স্তরটি খুব কম সেট করুন এবং আপনি Android OS এর নতুন বৈশিষ্ট্যগুলি মিস করবেন৷ এটিকে খুব বেশি সেট করুন এবং আপনার অ্যাপ শুধুমাত্র নতুন ডিভাইসে চলতে পারে।

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

ধাপ 2: সামঞ্জস্য অন্বেষণ করুন

বিভিন্ন Android API স্তরের জন্য লেখা একটি সাধারণ চ্যালেঞ্জ যা অ্যাপ বিকাশকারীরা সম্মুখীন হয়, তাই Android ফ্রেমওয়ার্ক টিম আপনাকে সাহায্য করার জন্য অনেক কাজ করেছে।

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

  1. MainActivity খুলুন।
  2. লক্ষ্য করুন যে আপনার MainActivity ক্লাসটি Activity থেকে নয়, AppCompatActivity থেকে প্রসারিত হয়।
class MainActivity : AppCompatActivity() { 
...

AppCompatActivity হল একটি সামঞ্জস্যপূর্ণ শ্রেণী যা নিশ্চিত করে যে আপনার কার্যকলাপ বিভিন্ন প্ল্যাটফর্মের OS লেভেল জুড়ে একই রকম দেখায়।

  1. আপনার ক্লাসের জন্য আমদানি প্রসারিত করতে import দিয়ে শুরু হওয়া লাইনের পাশে + চিহ্নে ক্লিক করুন। মনে রাখবেন যে AppCompatActivity ক্লাসটি androidx.appcompat.app প্যাকেজ থেকে আমদানি করা হয়েছে। অ্যান্ড্রয়েড androidx লাইব্রেরির নামস্থান হল অ্যান্ড্রয়েডএক্স।
  2. build.gradle (মডিউল: অ্যাপ) খুলুন এবং নির্ভরতা বিভাগে স্ক্রোল করুন।
dependencies {
   implementation fileTree(dir: 'libs', include: ['*.jar'])
   implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
   implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
   implementation 'androidx.core:core-ktx:1.0.1'
   implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
   testImplementation 'junit:junit:4.12'
   androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
   androidTestImplementation 
        'androidx.test.espresso:espresso-core:3.1.0-alpha4'
}

appcompat লাইব্রেরির উপর নির্ভরতা লক্ষ্য করুন, যা অ্যান্ড্রয়েডএক্সের অংশ এবং এতে androidx AppCompatActivity ক্লাস রয়েছে।

ধাপ 3: ভেক্টর অঙ্কনযোগ্য জন্য সামঞ্জস্য যোগ করুন

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

  1. রেস ফোল্ডারটি প্রসারিত করুন এবং তারপর অঙ্কনযোগ্য প্রসারিত করুন। ডাই ইমেজ এক ডাবল ক্লিক করুন.

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

    ভেক্টর ড্রয়েবল সম্পর্কে একটি গুরুত্বপূর্ণ বিষয় লক্ষ্য করা যায় যে তারা API 21 এর পরে সমর্থিত। কিন্তু আপনার অ্যাপের ন্যূনতম SDK এপিআই 19 এ সেট করা আছে। আপনি যদি একটি API 19 ডিভাইস বা এমুলেটরে আপনার অ্যাপটি ব্যবহার করে দেখেন, তাহলে আপনি দেখতে পাবেন যে অ্যাপটি তৈরি এবং কাজ করছে বলে মনে হচ্ছে। তাহলে এটা কিভাবে কাজ করে?

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

    ভাল খবর হল যে API লেভেল 7-এ ফিরে আসা ভেক্টর ড্রয়েবলের জন্য একটি Android X সামঞ্জস্যপূর্ণ লাইব্রেরি রয়েছে।
  2. build.gradle খুলুন (মডিউল: অ্যাপ)defaultConfig বিভাগে এই লাইন যোগ করুন:
vectorDrawables.useSupportLibrary = true
  1. এখন সিঙ্ক বোতামে ক্লিক করুন। প্রতিবার যখন একটি build.gradle ফাইল পরিবর্তন করা হয়, আপনাকে প্রকল্পের সাথে বিল্ড ফাইলগুলিকে সিঙ্ক করতে হবে।
  2. main_activity.xml লেআউট ফাইলটি খুলুন। এই নেমস্পেসটি রুট <LinearLayout> ট্যাগে যোগ করুন, tools নামস্থানের নীচে:
xmlns:app="http://schemas.android.com/apk/res-auto"

app নামস্থানটি এমন বৈশিষ্ট্যগুলির জন্য যা আপনার কাস্টম কোড বা লাইব্রেরি থেকে আসে এবং মূল Android ফ্রেমওয়ার্ক নয়।

  1. <ImageView> এলিমেন্টে android:src অ্যাট্রিবিউট পরিবর্তন করুন app:srcCompat হতে।
app:srcCompat="@drawable/empty_dice"


app:srcCompat অ্যাট্রিবিউট Android X লাইব্রেরি ব্যবহার করে Android এর পুরানো সংস্করণগুলিতে, API স্তর 7-এ ভেক্টর ড্রয়েবল সমর্থন করতে।

  1. আপনার অ্যাপ তৈরি করুন এবং চালান। আপনি স্ক্রিনে আলাদা কিছু দেখতে পাবেন না, কিন্তু এখন আপনার অ্যাপকে ডাইস ইমেজের জন্য জেনারেট করা PNG ফাইল ব্যবহার করতে হবে না যেখানেই চলে, যার মানে একটি ছোট অ্যাপ ফাইল।

অ্যান্ড্রয়েড স্টুডিও প্রকল্প: ডাইসরোলার ফাইনাল

চ্যালেঞ্জ: দুটি পাশা পেতে DiceRoller অ্যাপটি পরিবর্তন করুন। ব্যবহারকারী যখন রোল বোতামে ট্যাপ করে, তখন প্রতিটি ডাই-এর মান অন্যের থেকে স্বাধীন হওয়া উচিত।

টিপ: একটি এলোমেলো অঙ্কনযোগ্য চিত্র পেতে একটি নতুন ব্যক্তিগত ফাংশন তৈরি করুন এবং অঙ্কনযোগ্য সংস্থানের জন্য একটি পূর্ণসংখ্যা প্রদান করুন৷ ডাই ইমেজ প্রতিটি জন্য যে ফাংশন ব্যবহার করুন.

private fun getRandomDiceImage() : Int { ... }

কোডিং চ্যালেঞ্জ সমাধান কোড

অ্যান্ড্রয়েড স্টুডিও প্রকল্প: ডাইসরোলার ফাইনাল-চ্যালেঞ্জ

অ্যাপ সম্পদ:

  • আপনার অ্যাপের সংস্থানগুলিতে ছবি এবং আইকন, অ্যাপে ব্যবহৃত মানক রঙ, স্ট্রিং এবং XML লেআউট অন্তর্ভুক্ত থাকতে পারে। এই সমস্ত সংস্থান res ফোল্ডারে সংরক্ষণ করা হয়।
  • drawable সংস্থান ফোল্ডারটি যেখানে আপনার অ্যাপের জন্য সমস্ত চিত্র সংস্থান রাখা উচিত।

চিত্র দর্শনে ভেক্টর অঙ্কনযোগ্য ব্যবহার করা:

  • ভেক্টর অঙ্কনযোগ্য হল XML বিন্যাসে বর্ণিত চিত্র। ভেক্টর ড্রয়েবলগুলি বিটম্যাপ চিত্রগুলির (যেমন PNG ফাইল) চেয়ে বেশি নমনীয় কারণ সেগুলি যে কোনও আকার বা রেজোলিউশনে স্কেল করা যেতে পারে।
  • আপনার অ্যাপের লেআউটে একটি অঙ্কনযোগ্য যোগ করতে, একটি <ImageView> উপাদান ব্যবহার করুন। ছবির উৎস android:src অ্যাট্রিবিউটে রয়েছে। অঙ্কনযোগ্য সংস্থান ফোল্ডারটি উল্লেখ করতে, @drawable ব্যবহার করুন, উদাহরণস্বরূপ "@drawable/image_name"
  • ছবির জন্য আপনার MainActivity কোডে ImageView ভিউ ব্যবহার করুন। ভিউ এর ইমেজকে ভিন্ন রিসোর্সে পরিবর্তন করতে আপনি setImageResource() ব্যবহার করতে পারেন। নির্দিষ্ট অঙ্কনযোগ্য উল্লেখ করতে R.drawable ব্যবহার করুন, উদাহরণস্বরূপ setImageResource(R.drawable.image_name)

lateinit কীওয়ার্ড:

  • আপনার কোডে findViewById() করার জন্য কলগুলিকে ছোট করুন সেই ভিউগুলি ধরে রাখার জন্য ক্ষেত্রগুলি ঘোষণা করে, এবং onCreate() এ ক্ষেত্রগুলি শুরু করুন৷ ক্ষেত্রের জন্য lateinit কীওয়ার্ডটি ব্যবহার করুন যাতে এটি বাতিলযোগ্য ঘোষণা করার প্রয়োজন না হয়।

ডিজাইন-টাইম অ্যাট্রিবিউটের জন্য tools নামস্থান:

  • শুধুমাত্র অ্যান্ড্রয়েড স্টুডিওর প্রিভিউ বা ডিজাইন এডিটরে একটি ছবি প্রদর্শন করতে আপনার লেআউটের <ImageView> এলিমেন্টে tools:src অ্যাট্রিবিউট ব্যবহার করুন। তারপরে আপনি চূড়ান্ত অ্যাপের জন্য android:src এর জন্য একটি খালি ছবি ব্যবহার করতে পারেন।
  • অ্যান্ড্রয়েড স্টুডিওতে লেআউটের জন্য প্লেসহোল্ডার কন্টেন্ট বা ইঙ্গিত তৈরি করতে অ্যান্ড্রয়েড লেআউট ফাইলে tools নেমস্পেস ব্যবহার করুন। tools অ্যাট্রিবিউট দ্বারা ঘোষিত ডেটা চূড়ান্ত অ্যাপে ব্যবহার করা হয় না।

API স্তর:

  • প্রতিটি Android OS এর একটি অফিসিয়াল সংস্করণ নম্বর এবং নাম রয়েছে (উদাহরণস্বরূপ Android 9.0, "Pie") এবং একটি API স্তর (API 28)। আপনার অ্যাপ সমর্থন করে Android এর সংস্করণগুলি নির্দেশ করতে আপনার অ্যাপের Gradle ফাইলগুলিতে API স্তরগুলি ব্যবহার করুন৷
  • build.gradle ফাইলের compileSdkVersion প্যারামিটারটি Android API স্তর নির্দিষ্ট করে যা Gradle আপনার অ্যাপ কম্পাইল করতে ব্যবহার করবে।
  • targetSdkVersion প্যারামিটারটি সাম্প্রতিকতম API স্তর নির্দিষ্ট করে যেটির বিরুদ্ধে আপনি আপনার অ্যাপটি পরীক্ষা করেছেন৷ অনেক ক্ষেত্রে এই প্যারামিটারের মান compileSdkVersion এর মতই থাকে।
  • minSdkVersion প্যারামিটারটি আপনার অ্যাপটি চালানো যেতে পারে এমন প্রাচীনতম API স্তর নির্দিষ্ট করে৷

অ্যান্ড্রয়েড জেটপ্যাক:

  • অ্যান্ড্রয়েড জেটপ্যাক হল লাইব্রেরিগুলির একটি সংগ্রহ, যা Google দ্বারা তৈরি করা হয়েছে, যা Android-এর পুরানো সংস্করণগুলিকে সমর্থন করার জন্য পশ্চাদপদ-সামঞ্জস্যপূর্ণ ক্লাস এবং সহায়ক ফাংশনগুলি অফার করে৷ জেটপ্যাক পূর্বে অ্যান্ড্রয়েড সাপোর্ট লাইব্রেরি নামে পরিচিত লাইব্রেরির সেটে প্রতিস্থাপন এবং প্রসারিত করে।
  • androidx প্যাকেজ থেকে আমদানি করা ক্লাসগুলি জেটপ্যাক লাইব্রেরিগুলিকে উল্লেখ করে৷ আপনার build.gradle ফাইলে জেটপ্যাকের নির্ভরতাও androidx দিয়ে শুরু হয়।

ভেক্টর অঙ্কনযোগ্য জন্য পশ্চাদমুখী সামঞ্জস্য:

  • ভেক্টর ড্রয়েবলগুলি শুধুমাত্র এপিআই 21-এর থেকে উচ্চতর Android-এর সংস্করণগুলিতে স্থানীয়ভাবে সমর্থিত৷ পুরানো সংস্করণগুলিতে, Gradle সেই অঙ্কনযোগ্যগুলির জন্য PNG ছবি তৈরি করে যখন আপনার অ্যাপ তৈরি করা হয়৷
  • আপনি উল্লেখ করতে পারেন যে Android সাপোর্ট লাইব্রেরিটি পুরানো API সংস্করণে ভেক্টর ড্রয়েবলের জন্য vectorDrawables.useSupportLibrary = true build.gradle ফাইলে সত্য কনফিগারেশন প্যারামিটারের সাথে ব্যবহার করা উচিত।
  • একবার আপনি ভেক্টর ড্রয়েবলের জন্য সমর্থন লাইব্রেরি সক্রিয় করলে, সেই ছবির জন্য ভেক্টর অঙ্কনযোগ্য উত্স নির্দিষ্ট করতে <ImageView> উপাদানে ( android:src এর পরিবর্তে) app:srcCompat অ্যাট্রিবিউটটি ব্যবহার করুন।

app নামস্থান:

  • আপনার XML লেআউট ফাইলের app নামস্থানটি এমন বৈশিষ্ট্যগুলির জন্য যা আপনার কাস্টম কোড বা লাইব্রেরি থেকে আসে, মূল Android ফ্রেমওয়ার্ক থেকে নয়।

উদাসীনতা কোর্স:

অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:

অন্যান্য:

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

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
  • হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.

প্রশিক্ষকরা এই পরামর্শগুলিকে তারা যতটা কম বা যতটা চান ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।

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

একটি অ্যাপ পরিবর্তন করুন

DiceRoller অ্যাপে একটি ক্লিয়ার বোতাম যোগ করুন যা ডাই ইমেজটিকে খালি ছবিতে ফিরিয়ে দেয়।

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

কোন <ImageView> অ্যাট্রিবিউটটি একটি সোর্স ইমেজ নির্দেশ করে যা শুধুমাত্র অ্যান্ড্রয়েড স্টুডিওতে ব্যবহার করা উচিত?

  • android:srcCompat
  • app:src
  • tools:src
  • tools:sourceImage

প্রশ্ন 2

কোটলিন কোডে কোন ImageView এর জন্য ইমেজ রিসোর্স পরিবর্তন করে? xmx

  • setImageResource()
  • setImageURI()
  • setImage()
  • setImageRes()

প্রশ্ন 3

একটি পরিবর্তনশীল ঘোষণার lateinit কীওয়ার্ড কোটলিন কোডে কী নির্দেশ করে?

  • পরিবর্তনশীল কখনও আরম্ভ করা হয় না.
  • ভেরিয়েবলটি শুধুমাত্র অ্যাপ রানটাইমে শুরু করা হয়।
  • ভেরিয়েবলটি স্বয়ংক্রিয়ভাবে null থেকে শুরু হয়।
  • ভেরিয়েবল পরে আরম্ভ করা হবে. আমি কথা দিচ্ছি!

প্রশ্ন 4

কোন গ্রেডল কনফিগারেশনটি নির্দেশ করে যে আপনার অ্যাপটি সবচেয়ে সাম্প্রতিক API স্তরের সাথে পরীক্ষা করা হয়েছে?

  • minSdkVersion
  • compileSdkVersion
  • targetSdkVersion
  • testSdkVersion

প্রশ্ন 5

আপনি আপনার কোডে একটি আমদানি লাইন দেখতে পাচ্ছেন যা androidx দিয়ে শুরু হয়। এটার মানে কি?

  • ক্লাসটি অ্যান্ড্রয়েড জেটপ্যাক লাইব্রেরির অংশ।
  • ক্লাসটি একটি বাহ্যিক লাইব্রেরিতে রয়েছে যা অ্যাপটি চালানোর সময় গতিশীলভাবে লোড হবে।
  • ক্লাসটি "অতিরিক্ত" এবং আপনার ক্লাসের জন্য ঐচ্ছিক।
  • ক্লাসটি Android এর XML সমর্থনের অংশ।

গ্রেডিংয়ের জন্য আপনার অ্যাপটি জমা দিন

অ্যাপটিতে নিম্নলিখিতগুলি রয়েছে তা নিশ্চিত করতে পরীক্ষা করুন:

  • অ্যাপ লেআউটে একটি ইমেজ ভিউ এবং দুটি বোতাম থাকা উচিত।
  • অ্যাপের কোড দুটি ক্লিক হ্যান্ডলার সেট করা উচিত, প্রতিটি বোতামের জন্য একটি।
  • ক্লিয়ার বোতামের জন্য ক্লিক হ্যান্ডলার ডাই ইমেজটিকে R.drawable.empty_dice এ সেট করতে হবে।

পরবর্তী পাঠ শুরু করুন: 1.4: নিজেকে সাহায্য করতে শিখুন

এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, Android Kotlin Fundamentals codelabs ল্যান্ডিং পৃষ্ঠাটি দেখুন।