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

রচনা পদ্ধতি চেষ্টা করুন
জেটপ্যাক কম্পোজ হল Android এর জন্য প্রস্তাবিত UI টুলকিট। কম্পোজে লেআউটের সাথে কীভাবে কাজ করবেন তা শিখুন।

অ্যান্ড্রয়েড মৌলিক লেআউট ক্লাস View এবং ViewGroup উপর ভিত্তি করে আপনার UI তৈরি করার জন্য একটি পরিশীলিত এবং শক্তিশালী উপাদানযুক্ত মডেল অফার করে। প্ল্যাটফর্মটিতে বিভিন্ন ধরনের প্রি-বিল্ট View এবং ViewGroup সাবক্লাস রয়েছে—যাকে যথাক্রমে উইজেট এবং লেআউট বলা হয়—যা আপনি আপনার UI তৈরি করতে ব্যবহার করতে পারেন।

উপলব্ধ উইজেটগুলির একটি আংশিক তালিকার মধ্যে রয়েছে Button , TextView , EditText , ListView , CheckBox , RadioButton , Gallery , Spinner , এবং আরও বিশেষ উদ্দেশ্য AutoCompleteTextView , ImageSwitcher , এবং TextSwitcher

উপলব্ধ লেআউটগুলির মধ্যে রয়েছে LinearLayout , FrameLayout , RelativeLayout , এবং অন্যান্য৷ আরও উদাহরণের জন্য, সাধারণ লেআউটগুলি দেখুন।

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

আপনার নিজস্ব View সাবক্লাস তৈরি করা আপনাকে একটি স্ক্রীন উপাদানের উপস্থিতি এবং কার্যকারিতার উপর সুনির্দিষ্ট নিয়ন্ত্রণ দেয়। কাস্টম ভিউ দিয়ে আপনি যে কন্ট্রোল পান তার একটি ধারণা দিতে, আপনি সেগুলি দিয়ে কী করতে পারেন তার কিছু উদাহরণ এখানে দেওয়া হল:

  • আপনি একটি সম্পূর্ণ কাস্টম-রেন্ডার করা View টাইপ তৈরি করতে পারেন—উদাহরণস্বরূপ, একটি "ভলিউম কন্ট্রোল" নব, 2D গ্রাফিক্স ব্যবহার করে রেন্ডার করা হয়েছে, যা একটি এনালগ ইলেকট্রনিক নিয়ন্ত্রণের মতো।
  • আপনি একটি নতুন একক উপাদানে View উপাদানগুলির একটি গ্রুপকে একত্রিত করতে পারেন, সম্ভবত একটি কম্বো বক্সের মতো কিছু তৈরি করতে (পপআপ তালিকা এবং বিনামূল্যে প্রবেশের পাঠ্য ক্ষেত্রের সংমিশ্রণ), একটি ডুয়াল-পেন নির্বাচক নিয়ন্ত্রণ (একটি তালিকা সহ একটি বাম এবং ডান ফলক) প্রতিটিতে যেখানে আপনি কোন আইটেমটি কোন তালিকায় রয়েছে তা পুনরায় বরাদ্দ করতে পারেন), এবং আরও অনেক কিছু।
  • আপনি পর্দায় একটি EditText উপাদান রেন্ডার করার উপায় ওভাররাইড করতে পারেন। নোটপ্যাড নমুনা অ্যাপ্লিকেশন একটি রেখাযুক্ত নোটপ্যাড পৃষ্ঠা তৈরি করতে ভাল প্রভাবের জন্য এটি ব্যবহার করে।
  • আপনি অন্যান্য ইভেন্টগুলি ক্যাপচার করতে পারেন—যেমন কী প্রেস—এবং সেগুলিকে কাস্টম উপায়ে পরিচালনা করতে পারেন, যেমন একটি গেমের জন্য৷

নিম্নলিখিত বিভাগগুলি কীভাবে কাস্টম ভিউ তৈরি করতে হয় এবং আপনার অ্যাপ্লিকেশনে সেগুলি ব্যবহার করতে হয় তা ব্যাখ্যা করে৷ বিস্তারিত রেফারেন্স তথ্যের জন্য, দেখুন ক্লাস View

মৌলিক পদ্ধতির

আপনার নিজের View উপাদানগুলি তৈরি করতে আপনার যা জানা দরকার তার একটি উচ্চ-স্তরের ওভারভিউ এখানে রয়েছে:

  1. আপনার নিজের ক্লাসের সাথে একটি বিদ্যমান View ক্লাস বা সাবক্লাস প্রসারিত করুন।
  2. সুপারক্লাস থেকে কিছু পদ্ধতি ওভাররাইড করুন। ওভাররাইড করার জন্য সুপারক্লাস পদ্ধতিগুলি on দিয়ে শুরু হয় —উদাহরণস্বরূপ, onDraw() , onMeasure() , এবং onKeyDown() । এটি Activity বা ListActivity on ইভেন্টগুলির মতো যা আপনি জীবনচক্র এবং অন্যান্য কার্যকারিতা হুকের জন্য ওভাররাইড করেন৷
  3. আপনার নতুন এক্সটেনশন ক্লাস ব্যবহার করুন. একবার সম্পূর্ণ হয়ে গেলে, আপনি আপনার নতুন এক্সটেনশন ক্লাসটি যে ভিউয়ের উপর ভিত্তি করে ছিল তার জায়গায় ব্যবহার করতে পারেন।

সম্পূর্ণরূপে কাস্টমাইজড উপাদান

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

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

একটি সম্পূর্ণ কাস্টমাইজড উপাদান তৈরি করতে, নিম্নলিখিত বিবেচনা করুন:

  • আপনি সবচেয়ে সাধারণ দৃশ্যটি প্রসারিত করতে পারেন তা হল View , তাই আপনি সাধারণত আপনার নতুন সুপার কম্পোনেন্ট তৈরি করতে এটি প্রসারিত করে শুরু করেন।
  • আপনি একটি কনস্ট্রাক্টর সরবরাহ করতে পারেন, যেটি XML থেকে বৈশিষ্ট্য এবং পরামিতি নিতে পারে এবং আপনি আপনার নিজস্ব বৈশিষ্ট্য এবং পরামিতিগুলি ব্যবহার করতে পারেন, যেমন VU মিটারের রঙ এবং পরিসীমা বা সুইয়ের প্রস্থ এবং স্যাঁতসেঁতে।
  • আপনি সম্ভবত আপনার কম্পোনেন্ট ক্লাসে আপনার নিজস্ব ইভেন্ট শ্রোতা, সম্পত্তি অ্যাক্সেসর এবং মডিফায়ারের পাশাপাশি আরও পরিশীলিত আচরণ তৈরি করতে চান।
  • আপনি প্রায় অবশ্যই onMeasure() ওভাররাইড করতে চান এবং আপনি যদি উপাদানটিকে কিছু দেখাতে চান তবে onDraw() ওভাররাইড করতে হবে। উভয়েরই ডিফল্ট আচরণ থাকলেও, ডিফল্ট onDraw() কিছুই করে না এবং ডিফল্ট onMeasure() সর্বদা 100x100 এর আকার সেট করে, যা আপনি সম্ভবত চান না।
  • প্রয়োজন অনুসারে আপনি on অন্যকে ওভাররাইড করতে পারেন।

প্রসারিত করুন onDraw() এবং onMeasure()

onDraw() পদ্ধতিটি একটি Canvas সরবরাহ করে যার উপর আপনি যা চান তা বাস্তবায়ন করতে পারেন: 2D গ্রাফিক্স, অন্যান্য স্ট্যান্ডার্ড বা কাস্টম উপাদান, স্টাইল করা পাঠ্য বা অন্য কিছু যা আপনি ভাবতে পারেন।

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

একটি উচ্চ স্তরে, onMeasure() বাস্তবায়ন এইরকম কিছু দেখায়:

  • ওভাররাইডেড onMeasure() পদ্ধতিটিকে প্রস্থ এবং উচ্চতা নির্দিষ্টকরণের সাথে বলা হয়, যা আপনার তৈরি করা প্রস্থ এবং উচ্চতা পরিমাপের সীমাবদ্ধতার জন্য প্রয়োজনীয়তা হিসাবে বিবেচিত হয়। widthMeasureSpec এবং heightMeasureSpec প্যারামিটার উভয়ই পূর্ণসংখ্যা কোড যা মাত্রা উপস্থাপন করে। এই স্পেসিফিকেশনের যে ধরনের বিধিনিষেধের প্রয়োজন হতে পারে তার একটি সম্পূর্ণ রেফারেন্স View.onMeasure(int, int) এর অধীনে রেফারেন্স ডকুমেন্টেশনে পাওয়া যাবে এই রেফারেন্স ডকুমেন্টেশনটি পুরো পরিমাপ ক্রিয়াকে ব্যাখ্যা করে।
  • আপনার উপাদানের onMeasure() পদ্ধতি একটি পরিমাপ প্রস্থ এবং উচ্চতা গণনা করে, যা উপাদান রেন্ডার করার জন্য প্রয়োজন। এটিকে পাস করা স্পেসিফিকেশনের মধ্যে থাকার চেষ্টা করতে হবে, যদিও এটি তাদের অতিক্রম করতে পারে। এই ক্ষেত্রে, অভিভাবক কি করবেন তা বেছে নিতে পারেন, যার মধ্যে ক্লিপিং, স্ক্রলিং, ব্যতিক্রম থ্রো করা বা onMeasure() আবার চেষ্টা করতে বলা, সম্ভবত বিভিন্ন পরিমাপের স্পেসিফিকেশন সহ।
  • যখন প্রস্থ এবং উচ্চতা গণনা করা হয়, গণনা করা পরিমাপের সাথে setMeasuredDimension(int width, int height) পদ্ধতিতে কল করুন। এটি করতে ব্যর্থ হলে একটি ব্যতিক্রম ঘটে।

ফ্রেমওয়ার্ক ভিউকে কল করে এমন অন্যান্য স্ট্যান্ডার্ড পদ্ধতির সংক্ষিপ্তসার এখানে রয়েছে:

শ্রেণী পদ্ধতি বর্ণনা
সৃষ্টি কনস্ট্রাক্টর কন্সট্রাক্টরের একটি ফর্ম আছে যা কোড থেকে ভিউ তৈরি করা হলে বলা হয় এবং একটি ফর্ম যাকে বলা হয় যখন লেআউট ফাইল থেকে ভিউ স্ফীত হয়। দ্বিতীয় ফর্মটি লেআউট ফাইলে সংজ্ঞায়িত বৈশিষ্ট্যগুলিকে পার্স করে এবং প্রয়োগ করে।
onFinishInflate() একটি দৃশ্যের পরে কল করা হয় এবং এর সমস্ত শিশু XML থেকে স্ফীত হয়।
লেআউট onMeasure(int, int) এই দৃশ্য এবং এর সমস্ত বাচ্চাদের জন্য আকারের প্রয়োজনীয়তা নির্ধারণ করতে বলা হয়।
onLayout(boolean, int, int, int, int) বলা হয় যখন এই দৃশ্যটিকে অবশ্যই তার সমস্ত বাচ্চাদের একটি আকার এবং অবস্থান নির্ধারণ করতে হবে।
onSizeChanged(int, int, int, int) এই দৃশ্যের আকার পরিবর্তন হলে কল করা হয়।
অঙ্কন onDraw(Canvas) যখন ভিউ এর বিষয়বস্তু রেন্ডার করতে হবে তখন বলা হয়।
ইভেন্ট প্রক্রিয়াকরণ onKeyDown(int, KeyEvent) একটি কী ডাউন ইভেন্ট ঘটলে কল করা হয়।
onKeyUp(int, KeyEvent) একটি কী আপ ইভেন্ট ঘটলে কল করা হয়।
onTrackballEvent(MotionEvent) ট্র্যাকবল মোশন ইভেন্ট ঘটলে কল করা হয়।
onTouchEvent(MotionEvent) একটি টাচস্ক্রিন মোশন ইভেন্ট ঘটলে কল করা হয়।
ফোকাস onFocusChanged(boolean, int, Rect) ভিউ যখন ফোকাস লাভ করে বা হারায় তখন বলা হয়।
onWindowFocusChanged(boolean) যখন ভিউ সম্বলিত উইন্ডো ফোকাস লাভ করে বা হারায় তখন কল করা হয়।
সংযুক্ত করা হচ্ছে onAttachedToWindow() ভিউ একটি উইন্ডোতে সংযুক্ত করা হলে কল করা হয়।
onDetachedFromWindow() যখন ভিউ এর জানালা থেকে বিচ্ছিন্ন হয় তখন বলা হয়।
onWindowVisibilityChanged(int) ভিউ ধারণকারী উইন্ডোর দৃশ্যমানতা পরিবর্তন করা হলে কল করা হয়।

যৌগিক নিয়ন্ত্রণ

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

অ্যান্ড্রয়েডে, এটি করার জন্য সহজে উপলব্ধ আরও দুটি দৃশ্য রয়েছে: Spinner এবং AutoCompleteTextView । নির্বিশেষে, একটি কম্বো বাক্সের জন্য এই ধারণাটি একটি ভাল উদাহরণ তৈরি করে।

একটি যৌগিক উপাদান তৈরি করতে, নিম্নলিখিতগুলি করুন:

  • একটি Activity মতোই, অন্তর্ভুক্ত উপাদানগুলি তৈরি করতে বা আপনার কোড থেকে প্রোগ্রাম্যাটিকভাবে নেস্ট করতে হয় ঘোষণামূলক (XML-ভিত্তিক) পদ্ধতি ব্যবহার করুন। স্বাভাবিক প্রারম্ভিক বিন্দু হল কোন ধরণের একটি Layout , তাই একটি ক্লাস তৈরি করুন যা একটি Layout প্রসারিত করে। একটি কম্বো বক্সের ক্ষেত্রে, আপনি অনুভূমিক অভিযোজন সহ একটি LinearLayout ব্যবহার করতে পারেন। আপনি ভিতরে অন্যান্য লেআউট নেস্ট করতে পারেন, তাই যৌগিক উপাদান নির্বিচারে জটিল এবং কাঠামোগত হতে পারে।
  • নতুন ক্লাসের জন্য কনস্ট্রাক্টরে, সুপারক্লাসের আশা করা যাই হোক না কেন প্যারামিটার নিন এবং প্রথমে সুপারক্লাস কনস্ট্রাক্টরের কাছে পাঠান। তারপর, আপনি আপনার নতুন উপাদানের মধ্যে ব্যবহার করার জন্য অন্যান্য ভিউ সেট আপ করতে পারেন। এখানে আপনি EditText ক্ষেত্র এবং পপআপ তালিকা তৈরি করবেন। আপনি XML-এ আপনার নিজস্ব বৈশিষ্ট্য এবং পরামিতিগুলি প্রবর্তন করতে পারেন যা আপনার কনস্ট্রাক্টর টানতে এবং ব্যবহার করতে পারে।
  • ঐচ্ছিকভাবে, এমন ইভেন্টের জন্য শ্রোতা তৈরি করুন যা আপনার অন্তর্নিহিত ভিউ তৈরি করতে পারে। একটি উদাহরণ হল তালিকা আইটেম ক্লিক শ্রোতার জন্য একটি শ্রোতা পদ্ধতি, যদি একটি তালিকা নির্বাচন করা হয় তাহলে EditText এর বিষয়বস্তু আপডেট করতে।
  • ঐচ্ছিকভাবে, অ্যাক্সেসর এবং মডিফায়ার দিয়ে আপনার নিজস্ব বৈশিষ্ট্য তৈরি করুন। উদাহরণস্বরূপ, EditText মানটি প্রাথমিকভাবে কম্পোনেন্টে সেট করা যাক এবং প্রয়োজনে এর বিষয়বস্তুর জন্য অনুসন্ধান করুন।
  • ঐচ্ছিকভাবে, onDraw() এবং onMeasure() ওভাররাইড করুন। একটি Layout প্রসারিত করার সময় এটি সাধারণত প্রয়োজন হয় না, যেহেতু লেআউটটিতে ডিফল্ট আচরণ রয়েছে যা সম্ভবত ভাল কাজ করে।
  • ঐচ্ছিকভাবে, অন্যান্য on ওভাররাইড করুন, যেমন onKeyDown() , যেমন একটি নির্দিষ্ট কী ট্যাপ করা হলে একটি কম্বো বক্সের পপআপ তালিকা থেকে নির্দিষ্ট ডিফল্ট মান বেছে নেওয়া।

নিম্নলিখিতগুলি সহ একটি কাস্টম নিয়ন্ত্রণের ভিত্তি হিসাবে একটি Layout ব্যবহার করার সুবিধা রয়েছে:

  • আপনি একটি অ্যাক্টিভিটি স্ক্রীনের মতোই ঘোষণামূলক XML ফাইলগুলি ব্যবহার করে লেআউটটি নির্দিষ্ট করতে পারেন, অথবা আপনি প্রোগ্রামগতভাবে ভিউ তৈরি করতে পারেন এবং আপনার কোড থেকে লেআউটে নেস্ট করতে পারেন।
  • onDraw() এবং onMeasure() পদ্ধতি, এবং অন্যান্য on বেশিরভাগ ক্ষেত্রে উপযুক্ত আচরণ রয়েছে, তাই আপনাকে সেগুলি ওভাররাইড করতে হবে না।
  • আপনি দ্রুত নির্বিচারে জটিল যৌগিক দৃশ্য তৈরি করতে পারেন এবং সেগুলিকে একটি একক উপাদানের মতো পুনরায় ব্যবহার করতে পারেন।

একটি বিদ্যমান ভিউ টাইপ পরিবর্তন করুন

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

উদাহরণস্বরূপ, নোটপ্যাড নমুনা অ্যাপটি অ্যান্ড্রয়েড প্ল্যাটফর্ম ব্যবহারের অনেক দিক প্রদর্শন করে। তাদের মধ্যে একটি রেখাযুক্ত নোটপ্যাড তৈরি করতে একটি EditText দৃশ্য প্রসারিত করা হচ্ছে। এটি একটি নিখুঁত উদাহরণ নয়, এবং এটি করার জন্য APIগুলি পরিবর্তিত হতে পারে, তবে এটি নীতিগুলি প্রদর্শন করে৷

আপনি যদি ইতিমধ্যে এটি না করে থাকেন, তাহলে Android স্টুডিওতে নোটপ্যাড নমুনা আমদানি করুন বা প্রদত্ত লিঙ্কটি ব্যবহার করে উত্সটি দেখুন। বিশেষ করে, NoteEditor.java ফাইলে LinedEditText এর সংজ্ঞা দেখুন।

এই ফাইলটিতে কিছু বিষয় উল্লেখ করার মত রয়েছে:

  1. সংজ্ঞা

    ক্লাসটি নিম্নলিখিত লাইন দিয়ে সংজ্ঞায়িত করা হয়েছে:
    public static class LinedEditText extends EditText

    LinedEditText NoteEditor কার্যকলাপের মধ্যে একটি অভ্যন্তরীণ শ্রেণী হিসাবে সংজ্ঞায়িত করা হয়, কিন্তু এটি সর্বজনীন যাতে এটি NoteEditor.LinedEditText হিসাবে NoteEditor ক্লাসের বাইরে থেকে অ্যাক্সেস করা যায়।

    এছাড়াও, LinedEditText হল static , যার অর্থ এটি তথাকথিত "সিন্থেটিক পদ্ধতি" তৈরি করে না যা এটিকে প্যারেন্ট ক্লাস থেকে ডেটা অ্যাক্সেস করতে দেয়। এর মানে এটি NoteEditor এর সাথে দৃঢ়ভাবে সম্পর্কিত কিছুর পরিবর্তে একটি পৃথক শ্রেণী হিসাবে আচরণ করে। যদি বাইরের ক্লাস থেকে রাজ্যে অ্যাক্সেসের প্রয়োজন না হয় তবে ভিতরের ক্লাস তৈরি করার এটি একটি পরিষ্কার উপায়। এটি জেনারেট করা ক্লাসটিকে ছোট রাখে এবং এটিকে অন্য ক্লাস থেকে সহজেই ব্যবহার করতে দেয়।

    LinedEditText EditText প্রসারিত করে, যা এই ক্ষেত্রে কাস্টমাইজ করার দৃশ্য। আপনি শেষ হলে, নতুন ক্লাস একটি সাধারণ EditText দৃশ্যের জন্য প্রতিস্থাপন করতে পারে।

  2. ক্লাস শুরু

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

  3. ওভাররাইড করা পদ্ধতি

    এই উদাহরণটি শুধুমাত্র onDraw() পদ্ধতিকে ওভাররাইড করে, কিন্তু আপনার নিজস্ব কাস্টম উপাদান তৈরি করার সময় আপনাকে অন্যদের ওভাররাইড করতে হতে পারে।

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

  4. কাস্টম উপাদান

    আপনি এখন আপনার কাস্টম উপাদান আছে, কিন্তু কিভাবে আপনি এটি ব্যবহার করতে পারেন? নোটপ্যাড উদাহরণে, কাস্টম উপাদানটি সরাসরি ঘোষণামূলক লেআউট থেকে ব্যবহার করা হয়, তাই res/layout ফোল্ডারে note_editor.xml দেখুন:

    <view xmlns:android="http://schemas.android.com/apk/res/android"
        class="com.example.android.notepad.NoteEditor$LinedEditText"
        android:id="@+id/note"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:padding="5dp"
        android:scrollbars="vertical"
        android:fadingEdge="vertical"
        android:gravity="top"
        android:textSize="22sp"
        android:capitalize="sentences"
    />

    কাস্টম উপাদানটি XML-এ একটি জেনেরিক ভিউ হিসাবে তৈরি করা হয় এবং পুরো প্যাকেজ ব্যবহার করে ক্লাসটি নির্দিষ্ট করা হয়। আপনি যে অভ্যন্তরীণ শ্রেণীটি সংজ্ঞায়িত করেছেন তা NoteEditor$LinedEditText স্বরলিপি ব্যবহার করে উল্লেখ করা হয়েছে, যা জাভা প্রোগ্রামিং ভাষায় অভ্যন্তরীণ ক্লাসগুলি উল্লেখ করার একটি আদর্শ উপায়।

    যদি আপনার কাস্টম ভিউ উপাদানটি একটি অভ্যন্তরীণ শ্রেণী হিসাবে সংজ্ঞায়িত না হয় তবে আপনি XML উপাদানের নাম সহ ভিউ উপাদানটি ঘোষণা করতে পারেন এবং class বৈশিষ্ট্যটি বাদ দিতে পারেন। যেমন:

    <com.example.android.notepad.LinedEditText
      id="@+id/note"
      ... />

    লক্ষ্য করুন যে LinedEditText ক্লাস এখন একটি পৃথক ক্লাস ফাইল। যখন ক্লাসটি NoteEditor ক্লাসে নেস্ট করা হয়, তখন এই কৌশলটি কাজ করে না।

    সংজ্ঞার অন্যান্য বৈশিষ্ট্য এবং পরামিতিগুলি হল কাস্টম কম্পোনেন্ট কনস্ট্রাক্টরে পাস করা হয় এবং তারপরে EditText কনস্ট্রাক্টরের মাধ্যমে পাস করা হয়, তাই তারা একই প্যারামিটার যা আপনি একটি EditText ভিউয়ের জন্য ব্যবহার করেন। আপনার নিজের প্যারামিটারগুলিও যোগ করা সম্ভব।

কাস্টম উপাদানগুলি তৈরি করা আপনার যতটা প্রয়োজন ততই জটিল।

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