অ্যান্ড্রয়েড আপনার UI তৈরির জন্য একটি অত্যাধুনিক এবং শক্তিশালী কম্পোনেন্টাইজড মডেল প্রদান করে, যা View এবং ViewGroup নামক মৌলিক লেআউট ক্লাসগুলোর উপর ভিত্তি করে নির্মিত। এই প্ল্যাটফর্মে বিভিন্ন ধরনের পূর্ব-নির্মিত View এবং ViewGroup সাবক্লাস রয়েছে—যাদেরকে যথাক্রমে উইজেট এবং লেআউট বলা হয়—যা ব্যবহার করে আপনি আপনার UI তৈরি করতে পারেন।
উপলব্ধ উইজেটগুলোর একটি আংশিক তালিকার মধ্যে রয়েছে Button , TextView , EditText , ListView , CheckBox , RadioButton , Gallery , Spinner এবং আরও বিশেষ উদ্দেশ্যে AutoCompleteTextView , ImageSwitcher ও TextSwitcher ।
উপলব্ধ লেআউটগুলোর মধ্যে রয়েছে LinearLayout , FrameLayout , RelativeLayout এবং অন্যান্য। আরও উদাহরণের জন্য, সাধারণ লেআউটসমূহ (Common layouts) দেখুন।
যদি আগে থেকে তৈরি কোনো উইজেট বা লেআউট আপনার প্রয়োজন মেটাতে না পারে, তবে আপনি নিজের View সাবক্লাস তৈরি করতে পারেন। যদি আপনার কেবল বিদ্যমান কোনো উইজেট বা লেআউটে সামান্য পরিবর্তন করার প্রয়োজন হয়, তবে আপনি সেই উইজেট বা লেআউটটিকে সাবক্লাস করে তার মেথডগুলো ওভাররাইড করতে পারেন।
আপনার নিজস্ব View সাবক্লাস তৈরি করলে আপনি একটি স্ক্রিন এলিমেন্টের চেহারা এবং কার্যকারিতার উপর সুনির্দিষ্ট নিয়ন্ত্রণ লাভ করেন। কাস্টম ভিউয়ের মাধ্যমে আপনি কী ধরনের নিয়ন্ত্রণ পান, সে সম্পর্কে ধারণা দেওয়ার জন্য, এগুলি দিয়ে আপনি কী কী করতে পারেন তার কিছু উদাহরণ নিচে দেওয়া হলো:
- আপনি সম্পূর্ণ নিজস্ব আঙ্গিকে রেন্ডার করা একটি
Viewটাইপ তৈরি করতে পারেন—উদাহরণস্বরূপ, একটি "ভলিউম কন্ট্রোল" নব, যা টু-ডি গ্রাফিক্স ব্যবহার করে রেন্ডার করা হয় এবং দেখতে একটি অ্যানালগ ইলেকট্রনিক কন্ট্রোলের মতো। - আপনি একগুচ্ছ
Viewকম্পোনেন্টকে একত্রিত করে একটি নতুন একক কম্পোনেন্ট তৈরি করতে পারেন, যেমন—একটি কম্বো বক্স (পপআপ লিস্ট এবং ফ্রি এন্ট্রি টেক্সট ফিল্ডের সমন্বয়), একটি ডুয়াল-পেন সিলেক্টর কন্ট্রোল (বাম ও ডান পেন, যার প্রতিটিতে একটি করে লিস্ট থাকে এবং আপনি কোন আইটেম কোন লিস্টে থাকবে তা পুনর্নির্ধারণ করতে পারেন), ইত্যাদি। - স্ক্রিনে একটি
EditTextকম্পোনেন্ট যেভাবে রেন্ডার হবে, তা আপনি পরিবর্তন করতে পারেন। NotePad স্যাম্পল অ্যাপটি একটি লাইন টানা নোটপ্যাড পৃষ্ঠা তৈরি করতে এটি চমৎকারভাবে ব্যবহার করে। - আপনি অন্যান্য ইভেন্ট—যেমন কী-প্রেস—ক্যাপচার করতে পারেন এবং সেগুলোকে একটি গেমের জন্য নিজস্ব উপায়ে পরিচালনা করতে পারেন।
নিম্নলিখিত বিভাগগুলিতে কাস্টম ভিউ তৈরি করার এবং আপনার অ্যাপ্লিকেশনে সেগুলি ব্যবহার করার পদ্ধতি ব্যাখ্যা করা হয়েছে। বিস্তারিত তথ্যের জন্য, View ক্লাসটি দেখুন।
মৌলিক পদ্ধতি
আপনার নিজের View কম্পোনেন্ট তৈরি করার জন্য যা যা জানা প্রয়োজন, তার একটি উচ্চ-স্তরের সংক্ষিপ্ত বিবরণ এখানে দেওয়া হলো:
- বিদ্যমান কোনো
Viewক্লাস বা সাবক্লাসকে আপনার নিজের ক্লাস দিয়ে সম্প্রসারিত করুন। - সুপারক্লাসের কিছু মেথড ওভাররাইড করুন। যে সুপারক্লাস মেথডগুলো ওভাররাইড করতে হবে, সেগুলো
onদিয়ে শুরু হয়—যেমন,onDraw(),onMeasure(), এবংonKeyDown()। এটিActivityবাListActivityonইভেন্টগুলোর মতোই, যেগুলো আপনি লাইফসাইকেল এবং অন্যান্য ফাংশনালিটি হুকের জন্য ওভাররাইড করেন। - আপনার নতুন এক্সটেনশন ক্লাসটি ব্যবহার করুন। একবার সম্পন্ন হলে, আপনি যে ভিউটির উপর ভিত্তি করে এটি তৈরি করা হয়েছে, তার পরিবর্তে আপনার নতুন এক্সটেনশন ক্লাসটি ব্যবহার করতে পারবেন।
সম্পূর্ণরূপে কাস্টমাইজড উপাদান
আপনি সম্পূর্ণ কাস্টমাইজড গ্রাফিক্যাল কম্পোনেন্ট তৈরি করতে পারেন, যা আপনার ইচ্ছামতো দেখাবে। হয়তো আপনি একটি গ্রাফিক্যাল ভিইউ মিটার চান যা দেখতে পুরোনো অ্যানালগ গেজের মতো, অথবা এমন একটি সিং-অ্যালং টেক্সট ভিউ চান যেখানে কারাওকে মেশিনের সাথে গান গাওয়ার সময় একটি বাউন্সিং বল গানের কথাগুলোর ওপর দিয়ে চলতে থাকে। আপনি এমন কিছু চাইতে পারেন যা বিল্ট-ইন কম্পোনেন্টগুলো কোনোভাবেই করতে পারে না, আপনি সেগুলোকে যেভাবে খুশি একত্রিত করুন না কেন।
সৌভাগ্যবশত, আপনি আপনার ইচ্ছামতো দেখতে ও কাজ করতে পারে এমন কম্পোনেন্ট তৈরি করতে পারেন, যার একমাত্র সীমাবদ্ধতা হলো আপনার কল্পনা, স্ক্রিনের আকার এবং উপলব্ধ প্রসেসিং ক্ষমতা। তবে মনে রাখতে হবে যে, আপনার অ্যাপ্লিকেশনটিকে হয়তো আপনার ডেস্কটপ ওয়ার্কস্টেশনের চেয়ে উল্লেখযোগ্যভাবে কম ক্ষমতাসম্পন্ন কোনো ডিভাইসে চালাতে হতে পারে।
একটি সম্পূর্ণ কাস্টমাইজড কম্পোনেন্ট তৈরি করতে, নিম্নলিখিত বিষয়গুলো বিবেচনা করুন:
- সবচেয়ে সাধারণ ভিউ যা আপনি এক্সটেন্ড করতে পারেন তা হলো
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)মেথডটি কল করুন। এটি করতে ব্যর্থ হলে একটি এক্সেপশন দেখা দেবে।
ফ্রেমওয়ার্কটি ভিউ-এর ক্ষেত্রে যেসব অন্যান্য স্ট্যান্ডার্ড মেথড কল করে, তার একটি সারসংক্ষেপ নিচে দেওয়া হলো:
| বিভাগ | পদ্ধতি | বর্ণনা |
|---|---|---|
| সৃষ্টি | নির্মাণকারী | কনস্ট্রাক্টরের একটি রূপ রয়েছে যা কোড থেকে ভিউ তৈরি করার সময় কল করা হয় এবং আরেকটি রূপ রয়েছে যা লেআউট ফাইল থেকে ভিউ ইনফ্লেট করার সময় কল করা হয়। দ্বিতীয় রূপটি লেআউট ফাইলে সংজ্ঞায়িত অ্যাট্রিবিউটগুলো পার্স করে এবং প্রয়োগ করে। |
| একটি ভিউ এবং তার সমস্ত চাইল্ড XML থেকে ইনফ্লেট করার পরে এটিকে কল করা হয়। | |
| লেআউট | | এই ভিউ এবং এর সকল চাইল্ড ভিউয়ের জন্য প্রয়োজনীয় আকারের পরিমাণ নির্ধারণ করতে ডাকা হয়েছে। |
| যখন এই ভিউকে তার সকল চাইল্ডের জন্য একটি সাইজ ও পজিশন নির্ধারণ করতে হয়, তখন এই ফাংশনটি কল করা হয়। | |
| এই ভিউটির আকার পরিবর্তিত হলে এটি কল করা হয়। | |
| অঙ্কন | | যখন ভিউকে তার বিষয়বস্তু রেন্ডার করতে হয়, তখন এটি কল করা হয়। |
| ইভেন্ট প্রক্রিয়াকরণ | | যখন কোনো কী ডাউন ইভেন্ট ঘটে তখন এটি কল করা হয়। |
| যখন কোনো কী-আপ ইভেন্ট ঘটে তখন এটি কল করা হয়। | |
| যখন কোনো ট্র্যাকবল মোশন ইভেন্ট ঘটে তখন এটি কল করা হয়। | |
| টাচস্ক্রিনে কোনো নড়াচড়ার ঘটনা ঘটলে এটি কল করা হয়। | |
| ফোকাস | | যখন ভিউটি ফোকাস পায় বা হারায় তখন এটি কল করা হয়। |
| যে উইন্ডোতে দৃশ্যটি রয়েছে, সেটি ফোকাস পেলে বা হারালে এই ফাংশনটি কল করা হয়। | |
| সংযুক্ত করা | | যখন ভিউটি কোনো উইন্ডোর সাথে সংযুক্ত করা হয়, তখন এটি কল করা হয়। |
| যখন দৃশ্যটি তার জানালা থেকে বিচ্ছিন্ন হয়ে যায় তখন এটিকে ডাকা হয়। | |
| যে উইন্ডোতে ভিউটি রয়েছে, তার দৃশ্যমানতা পরিবর্তিত হলে এটি কল করা হয়। |
যৌগিক নিয়ন্ত্রণ
আপনি যদি সম্পূর্ণ কাস্টমাইজড কম্পোনেন্ট তৈরি করতে না চান, বরং বিদ্যমান কিছু কন্ট্রোল নিয়ে একটি পুনঃব্যবহারযোগ্য কম্পোনেন্ট তৈরি করতে চান, তাহলে একটি কম্পাউন্ড কম্পোনেন্ট (বা কম্পাউন্ড কন্ট্রোল) তৈরি করাই সবচেয়ে ভালো হতে পারে। সংক্ষেপে, এটি বেশ কিছু স্বতন্ত্র কন্ট্রোল বা ভিউকে একত্রিত করে একটি যৌক্তিক আইটেম গ্রুপে পরিণত করে, যেগুলোকে একটি একক সত্তা হিসেবে গণ্য করা যায়। উদাহরণস্বরূপ, একটি কম্বো বক্স হতে পারে একটি একক লাইনের 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 ভিউকে প্রসারিত করে একটি লাইনযুক্ত নোটপ্যাড তৈরি করা। এটি কোনো নিখুঁত উদাহরণ নয়, এবং এটি করার জন্য ব্যবহৃত এপিআইগুলো পরিবর্তিত হতে পারে, কিন্তু এটি মূল নীতিগুলো প্রদর্শন করে।
যদি আপনি ইতিমধ্যে তা না করে থাকেন, তাহলে Android Studio-তে NotePad স্যাম্পলটি ইম্পোর্ট করুন অথবা প্রদত্ত লিঙ্কটি ব্যবহার করে সোর্সটি দেখুন। বিশেষ করে, NoteEditor.java ফাইলে LinedEditText এর সংজ্ঞাটি দেখুন।
এই ফাইলে কিছু বিষয় লক্ষণীয়:
- সংজ্ঞা
ক্লাসটি নিম্নলিখিত লাইন দিয়ে সংজ্ঞায়িত করা হয়েছে:
public static class LinedEditText extends EditTextLinedEditTextNoteEditorঅ্যাক্টিভিটির মধ্যে একটি ইনার ক্লাস হিসেবে সংজ্ঞায়িত করা হয়েছে, কিন্তু এটি পাবলিক, যাতেNoteEditorক্লাসের বাইরে থেকে এটিকেNoteEditor.LinedEditTextহিসেবে অ্যাক্সেস করা যায়।এছাড়াও,
LinedEditTextহলোstatic, যার মানে হলো এটি তথাকথিত "synthetic methods" তৈরি করে না, যা একে প্যারেন্ট ক্লাস থেকে ডেটা অ্যাক্সেস করতে দেয়। এর মানে হলো, এটিNoteEditorসাথে ঘনিষ্ঠভাবে সম্পর্কিত কিছু না হয়ে একটি পৃথক ক্লাস হিসেবে কাজ করে। যদি ইনার ক্লাসগুলোর আউটার ক্লাসের স্টেট অ্যাক্সেস করার প্রয়োজন না হয়, তবে এটি তৈরি করার একটি পরিচ্ছন্ন উপায়। এটি তৈরি হওয়া ক্লাসটিকে ছোট রাখে এবং অন্যান্য ক্লাস থেকে এটিকে সহজে ব্যবহার করার সুযোগ দেয়।LinedEditText,EditTextextends করে, যা এই ক্ষেত্রে কাস্টমাইজ করার ভিউ। কাজ শেষ হলে, নতুন ক্লাসটি একটি সাধারণEditTextভিউ-এর বিকল্প হিসেবে কাজ করতে পারবে। - ক্লাস প্রারম্ভিকীকরণ
বরাবরের মতোই, প্রথমে সুপারক্লাসকে কল করা হয়। এটি কোনো ডিফল্ট কনস্ট্রাক্টর নয়, বরং একটি প্যারামিটারযুক্ত কনস্ট্রাক্টর। একটি XML লেআউট ফাইল থেকে যখন
EditTextইনফ্লেট করা হয়, তখন এই প্যারামিটারগুলো দিয়েই এটি তৈরি করা হয়। সুতরাং, এই কনস্ট্রাক্টরকে অবশ্যই প্যারামিটারগুলো গ্রহণ করতে হবে এবং সেগুলোকে সুপারক্লাস কনস্ট্রাক্টরের কাছেও পাঠিয়ে দিতে হবে। - ওভাররাইড করা পদ্ধতি
এই উদাহরণে শুধুমাত্র
onDraw()মেথডটি ওভাররাইড করা হয়েছে, কিন্তু আপনার নিজস্ব কাস্টম কম্পোনেন্ট তৈরি করার সময় অন্য মেথডগুলোও ওভাররাইড করার প্রয়োজন হতে পারে।এই স্যাম্পলের জন্য,
onDraw()মেথডটি ওভাররাইড করলে আপনিEditTextভিউ ক্যানভাসে নীল লাইনগুলো আঁকতে পারবেন। ক্যানভাসটি ওভাররাইড করাonDraw()মেথডে পাস করা হয়। মেথডটি শেষ হওয়ার আগেsuper.onDraw()মেথডটি কল করা হয়। সুপারক্লাস মেথডটি অবশ্যই কল করতে হবে। এক্ষেত্রে, আপনি যে লাইনগুলো অন্তর্ভুক্ত করতে চান, সেগুলো আঁকার পরে শেষে এটি কল করুন। - কাস্টম উপাদান
আপনার কাস্টম কম্পোনেন্টটি এখন তৈরি, কিন্তু এটি কীভাবে ব্যবহার করবেন? নোটপ্যাড উদাহরণে, কাস্টম কম্পোনেন্টটি সরাসরি ডিক্লারেটিভ লেআউট থেকে ব্যবহার করা হয়েছে, তাই
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 আরও বেশি ওভাররাইড করতে পারে এবং নিজস্ব হেল্পার মেথড যোগ করতে পারে, যার মাধ্যমে এর প্রোপার্টি ও আচরণকে ব্যাপকভাবে কাস্টমাইজ করা যায়। একমাত্র সীমাবদ্ধতা হলো আপনার কল্পনাশক্তি এবং কম্পোনেন্টটি দিয়ে আপনি কী করাতে চান।
