একটি ভাল-ডিজাইন করা কাস্টম ভিউ হল অন্য যেকোন ভাল ডিজাইন করা ক্লাসের মত। এটি একটি সাধারণ ইন্টারফেসের সাথে কার্যকারিতার একটি নির্দিষ্ট সেটকে এনক্যাপসুলেট করে, দক্ষতার সাথে CPU এবং মেমরি ব্যবহার করে এবং আরও অনেক কিছু। একটি ভালভাবে ডিজাইন করা ক্লাস হওয়ার পাশাপাশি, একটি কাস্টম ভিউ অবশ্যই নিম্নলিখিতগুলি করতে হবে:
- অ্যান্ড্রয়েড মান মেনে চলুন।
- কাস্টম শৈলীযোগ্য বৈশিষ্ট্যগুলি প্রদান করুন যা Android XML লেআউটগুলির সাথে কাজ করে৷
- অ্যাক্সেসিবিলিটি ইভেন্ট পাঠান।
- একাধিক অ্যান্ড্রয়েড প্ল্যাটফর্মের সাথে সামঞ্জস্যপূর্ণ হন।
অ্যান্ড্রয়েড ফ্রেমওয়ার্ক বেস ক্লাস এবং এক্সএমএল ট্যাগগুলির একটি সেট সরবরাহ করে যা আপনাকে এই সমস্ত প্রয়োজনীয়তা পূরণ করে এমন একটি দৃশ্য তৈরি করতে সহায়তা করে। একটি ভিউ ক্লাসের মূল কার্যকারিতা তৈরি করতে কীভাবে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক ব্যবহার করতে হয় এই পাঠটি আলোচনা করে।
আপনি কাস্টম ভিউ উপাদানগুলিতে অতিরিক্ত তথ্য পেতে পারেন।
সাবক্লাস একটি দৃশ্য
অ্যান্ড্রয়েড ফ্রেমওয়ার্কে সংজ্ঞায়িত সমস্ত ভিউ ক্লাস View
প্রসারিত করে। আপনার কাস্টম ভিউ সরাসরি View
প্রসারিত করতে পারে, অথবা আপনি বিদ্যমান ভিউ সাবক্লাসগুলির একটি, যেমন Button
প্রসারিত করে সময় বাঁচাতে পারেন।
অ্যান্ড্রয়েড স্টুডিওকে আপনার ভিউয়ের সাথে ইন্টারঅ্যাক্ট করার অনুমতি দিতে, আপনাকে ন্যূনতম একটি কনস্ট্রাক্টর প্রদান করতে হবে যেটি একটি Context
এবং একটি AttributeSet
অবজেক্টকে প্যারামিটার হিসেবে নেয়। এই কনস্ট্রাক্টর লেআউট সম্পাদককে আপনার দৃশ্যের একটি উদাহরণ তৈরি এবং সম্পাদনা করার অনুমতি দেয়।
কোটলিন
class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)
জাভা
class PieChart extends View { public PieChart(Context context, AttributeSet attrs) { super(context, attrs); } }
কাস্টম বৈশিষ্ট্য সংজ্ঞায়িত করুন
আপনার ইউজার ইন্টারফেসে একটি বিল্ট-ইন View
যোগ করতে, এটিকে একটি XML এলিমেন্টে উল্লেখ করুন এবং এলিমেন্ট অ্যাট্রিবিউট দিয়ে এর চেহারা এবং আচরণ নিয়ন্ত্রণ করুন। আপনি XML ব্যবহার করে কাস্টম ভিউ যোগ এবং স্টাইল করতে পারেন। আপনার কাস্টম ভিউতে এই আচরণটি সক্ষম করতে, নিম্নলিখিতগুলি করুন:
-
<declare-styleable>
রিসোর্স এলিমেন্টে আপনার ভিউয়ের জন্য কাস্টম অ্যাট্রিবিউট সংজ্ঞায়িত করুন। - আপনার XML লেআউটের বৈশিষ্ট্যগুলির জন্য মানগুলি নির্দিষ্ট করুন৷
- রানটাইমে বৈশিষ্ট্য মান পুনরুদ্ধার করুন.
- আপনার ভিউতে পুনরুদ্ধার করা বৈশিষ্ট্যের মানগুলি প্রয়োগ করুন।
এই বিভাগে আলোচনা করা হয়েছে কিভাবে কাস্টম বৈশিষ্ট্য সংজ্ঞায়িত করা যায় এবং তাদের মান নির্দিষ্ট করা যায়। পরবর্তী বিভাগে রানটাইমে মান পুনরুদ্ধার করা এবং প্রয়োগ করা কভার করে।
কাস্টম বৈশিষ্ট্য সংজ্ঞায়িত করতে, আপনার প্রকল্পে <declare-styleable>
সংস্থান যোগ করুন। এই সম্পদগুলিকে একটি res/values/attrs.xml
ফাইলে রাখা প্রথাগত। এখানে একটি attrs.xml
ফাইলের একটি উদাহরণ:
<resources> <declare-styleable name="PieChart"> <attr name="showText" format="boolean" /> <attr name="labelPosition" format="enum"> <enum name="left" value="0"/> <enum name="right" value="1"/> </attr> </declare-styleable> </resources>
এই কোডটি দুটি কাস্টম বৈশিষ্ট্য, showText
এবং labelPosition
ঘোষণা করে, যেটি PieChart
নামে একটি শৈলীযোগ্য সত্তার অন্তর্গত। স্টাইলযোগ্য সত্তার নাম হল, রীতি অনুসারে, কাস্টম ভিউকে সংজ্ঞায়িত করে এমন ক্লাসের নামের একই নাম। যদিও এই কনভেনশনটি অনুসরণ করার প্রয়োজন নেই, অনেক জনপ্রিয় কোড এডিটর এই নামকরণ কনভেনশনের উপর নির্ভর করে বিবৃতি সম্পূর্ণ করার জন্য।
একবার আপনি কাস্টম বৈশিষ্ট্যগুলি সংজ্ঞায়িত করলে, আপনি বিল্ট-ইন বৈশিষ্ট্যগুলির মতো লেআউট XML ফাইলগুলিতে সেগুলি ব্যবহার করতে পারেন৷ শুধুমাত্র পার্থক্য হল যে আপনার কাস্টম বৈশিষ্ট্যগুলি একটি ভিন্ন নামস্থানের অন্তর্গত। http://schemas.android.com/apk/res/android
namespace-এর সাথে সম্পর্কিত না হয়ে, তারা http://schemas.android.com/apk/res/[your package name]
এর অন্তর্গত। উদাহরণস্বরূপ, PieChart
জন্য সংজ্ঞায়িত বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করবেন তা এখানে:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto"> <com.example.customviews.charting.PieChart custom:showText="true" custom:labelPosition="left" /> </LinearLayout>
দীর্ঘ নেমস্পেস ইউআরআই পুনরাবৃত্তি না করতে, নমুনাটি একটি xmlns
নির্দেশিকা ব্যবহার করে। এই নির্দেশিকা http://schemas.android.com/apk/res/com.example.customviews
নামস্থানে উপনাম custom
নির্ধারণ করে। আপনি আপনার নামস্থানের জন্য যে কোনো উপনাম বেছে নিতে পারেন।
XML ট্যাগের নামটি লক্ষ্য করুন যা লেআউটে কাস্টম ভিউ যোগ করে। এটি কাস্টম ভিউ ক্লাসের সম্পূর্ণ যোগ্য নাম। যদি আপনার ভিউ ক্লাস একটি অভ্যন্তরীণ শ্রেণী হয়, তাহলে ভিউ এর বাইরের শ্রেণীর নামের সাথে এটিকে আরও যোগ্যতা অর্জন করুন। উদাহরণস্বরূপ, PieChart
ক্লাসে PieView
নামে একটি অভ্যন্তরীণ শ্রেণী রয়েছে। এই ক্লাস থেকে কাস্টম বৈশিষ্ট্যগুলি ব্যবহার করতে, আপনি com.example.customviews.charting.PieChart$PieView
ট্যাগটি ব্যবহার করেন।
কাস্টম বৈশিষ্ট্য প্রয়োগ করুন
যখন একটি XML লেআউট থেকে একটি ভিউ তৈরি করা হয়, তখন XML ট্যাগের সমস্ত বৈশিষ্ট্য রিসোর্স বান্ডেল থেকে পড়া হয় এবং একটি AttributeSet
হিসাবে ভিউ এর কনস্ট্রাক্টরে পাস করা হয়। যদিও AttributeSet
থেকে সরাসরি মানগুলি পড়া সম্ভব, এটি করার কিছু অসুবিধা রয়েছে:
- বৈশিষ্ট্য মানের মধ্যে সম্পদ উল্লেখ সমাধান করা হয় না.
- শৈলী প্রয়োগ করা হয় না.
পরিবর্তে, প্রাপ্ত করার জন্য AttributeSet
পাস করুন obtainStyledAttributes()
। এই পদ্ধতিটি একটি TypedArray
বিন্যাসের মানগুলিকে পাস করে যা ইতিমধ্যেই ডিরেফারেন্স এবং স্টাইল করা হয়েছে।
অ্যান্ড্রয়েড রিসোর্স কম্পাইলার আপনার জন্য কলিং obtainStyledAttributes()
সহজ করতে অনেক কাজ করে। res/
ডিরেক্টরির প্রতিটি <declare-styleable>
রিসোর্সের জন্য, জেনারেট করা R.java
অ্যাট্রিবিউট আইডির একটি অ্যারে এবং অ্যারের প্রতিটি অ্যাট্রিবিউটের জন্য সূচক সংজ্ঞায়িত করে এমন ধ্রুবকগুলির একটি সেট উভয়ই সংজ্ঞায়িত করে। আপনি TypedArray
থেকে বৈশিষ্ট্যগুলি পড়ার জন্য পূর্বনির্ধারিত ধ্রুবকগুলি ব্যবহার করেন। PieChart
ক্লাস কীভাবে তার বৈশিষ্ট্যগুলি পড়ে তা এখানে:
কোটলিন
init { context.theme.obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0).apply { try { mShowText = getBoolean(R.styleable.PieChart_showText, false) textPos = getInteger(R.styleable.PieChart_labelPosition, 0) } finally { recycle() } } }
জাভা
public PieChart(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0); try { mShowText = a.getBoolean(R.styleable.PieChart_showText, false); textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0); } finally { a.recycle(); } }
নোট করুন যে TypedArray
অবজেক্ট একটি ভাগ করা সম্পদ এবং ব্যবহারের পরে পুনর্ব্যবহৃত করা আবশ্যক।
বৈশিষ্ট্য এবং ঘটনা যোগ করুন
বৈশিষ্ট্যগুলি আচরণ এবং দৃশ্যগুলির উপস্থিতি নিয়ন্ত্রণ করার একটি শক্তিশালী উপায়, তবে সেগুলি কেবল তখনই পড়া যায় যখন দৃশ্যটি শুরু হয়৷ গতিশীল আচরণ প্রদান করতে, প্রতিটি কাস্টম বৈশিষ্ট্যের জন্য একটি প্রপার্টি গেটার এবং সেটার জুটি প্রকাশ করুন। নিম্নলিখিত স্নিপেট দেখায় কিভাবে PieChart
showText
নামক একটি সম্পত্তি প্রকাশ করে:
কোটলিন
fun isShowText(): Boolean { return mShowText } fun setShowText(showText: Boolean) { mShowText = showText invalidate() requestLayout() }
জাভা
public boolean isShowText() { return mShowText; } public void setShowText(boolean showText) { mShowText = showText; invalidate(); requestLayout(); }
লক্ষ্য করুন যে setShowText
কল invalidate()
এবং requestLayout()
। ভিউটি নির্ভরযোগ্যভাবে আচরণ করে তা নিশ্চিত করার জন্য এই কলগুলি অত্যন্ত গুরুত্বপূর্ণ। এর বৈশিষ্ট্যে যে কোনো পরিবর্তনের পরে আপনাকে ভিউটিকে বাতিল করতে হবে যা এর চেহারা পরিবর্তন করতে পারে, যাতে সিস্টেমটি জানে যে এটি পুনরায় আঁকা দরকার। একইভাবে, আপনাকে একটি নতুন লেআউটের অনুরোধ করতে হবে যদি কোনো সম্পত্তি এমনভাবে পরিবর্তিত হয় যা দৃশ্যের আকার বা আকৃতিকে প্রভাবিত করতে পারে। এই পদ্ধতি কলগুলি ভুলে যাওয়া বাগগুলি খুঁজে পাওয়া কঠিন হতে পারে৷
কাস্টম ভিউ অবশ্যই ইভেন্ট শ্রোতাদের গুরুত্বপূর্ণ ইভেন্টে যোগাযোগ করতে সহায়তা করবে। উদাহরণস্বরূপ, PieChart
একটি কাস্টম ইভেন্ট প্রকাশ করে যার নাম OnCurrentItemChanged
শ্রোতাদের জানানোর জন্য যে ব্যবহারকারী একটি নতুন পাই স্লাইসে ফোকাস করতে পাই চার্টটি ঘোরান।
বৈশিষ্ট্য এবং ইভেন্টগুলি প্রকাশ করতে ভুলে যাওয়া সহজ, বিশেষ করে যখন আপনি কাস্টম ভিউয়ের একমাত্র ব্যবহারকারী হন৷ আপনার ভিউ এর ইন্টারফেস সাবধানে সংজ্ঞায়িত করার জন্য সময় নেওয়া ভবিষ্যতের রক্ষণাবেক্ষণ খরচ কমিয়ে দেয়। অনুসরণ করার জন্য একটি ভাল নিয়ম হল আপনার কাস্টম ভিউয়ের দৃশ্যমান চেহারা বা আচরণকে প্রভাবিত করে এমন কোনও সম্পত্তি সর্বদা প্রকাশ করা।
অ্যাক্সেসযোগ্যতার জন্য ডিজাইন
আপনার কাস্টম ভিউ অবশ্যই বিস্তৃত ব্যবহারকারীদের সমর্থন করবে। এতে অক্ষম ব্যবহারকারীরা অন্তর্ভুক্ত যারা তাদের টাচস্ক্রিন দেখতে বা ব্যবহার করতে বাধা দেয়। প্রতিবন্ধী ব্যবহারকারীদের সমর্থন করতে, নিম্নলিখিতগুলি করুন:
-
android:contentDescription
অ্যাট্রিবিউট ব্যবহার করে আপনার ইনপুট ক্ষেত্র লেবেল করুন। - উপযুক্ত হলে
sendAccessibilityEvent()
কল করে অ্যাক্সেসিবিলিটি ইভেন্ট পাঠান। - বিকল্প কন্ট্রোলার সমর্থন করুন, যেমন একটি ডি-প্যাড বা ট্র্যাকবল।
অ্যাক্সেসযোগ্য দৃশ্য তৈরি করার বিষয়ে আরও তথ্যের জন্য, অ্যাপগুলিকে আরও অ্যাক্সেসযোগ্য করুন দেখুন।