একটি ভিউ ক্লাস তৈরি করুন

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

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

  • অ্যান্ড্রয়েড মানদণ্ড মেনে চলুন।
  • কাস্টম স্টাইলযোগ্য অ্যাট্রিবিউট প্রদান করুন যা অ্যান্ড্রয়েড এক্সএমএল লেআউটের সাথে কাজ করে।
  • অ্যাক্সেসিবিলিটি ইভেন্ট পাঠান।
  • একাধিক অ্যান্ড্রয়েড প্ল্যাটফর্মের সাথে সামঞ্জস্যপূর্ণ।

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

আপনি কাস্টম ভিউ কম্পোনেন্ট -এ অতিরিক্ত তথ্য খুঁজে পেতে পারেন।

একটি ভিউকে সাবক্লাস করুন

অ্যান্ড্রয়েড ফ্রেমওয়ার্কে সংজ্ঞায়িত সমস্ত ভিউ ক্লাস 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 নেমস্পেসের পরিবর্তে, এগুলো 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 থেকে মান পড়া সম্ভব, তবে এর কিছু অসুবিধা রয়েছে:

  • অ্যাট্রিবিউট মানের মধ্যে থাকা রিসোর্স রেফারেন্সগুলো সমাধান করা হয় না।
  • স্টাইল প্রয়োগ করা হয়নি।

এর পরিবর্তে, obtainStyledAttributes() মেথডে AttributeSet পাস করুন। এই মেথডটি এমন একটি 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() কল করে। ভিউটির নির্ভরযোগ্য আচরণ নিশ্চিত করার জন্য এই কলগুলো অত্যন্ত গুরুত্বপূর্ণ। ভিউটির প্রোপার্টিতে এমন কোনো পরিবর্তন যা এর চেহারা বদলে দিতে পারে, তার পরে আপনাকে ভিউটিকে invalidate করতে হবে, যাতে সিস্টেম বুঝতে পারে যে এটিকে পুনরায় আঁকতে হবে। একইভাবে, যদি কোনো প্রোপার্টি এমনভাবে পরিবর্তিত হয় যা ভিউটির আকার বা আকৃতিকে প্রভাবিত করতে পারে, তাহলে আপনাকে একটি নতুন লেআউটের জন্য অনুরোধ করতে হবে। এই মেথড কলগুলো ভুলে গেলে এমন বাগ তৈরি হতে পারে যা খুঁজে বের করা কঠিন।

গুরুত্বপূর্ণ ইভেন্ট জানানোর জন্য কাস্টম ভিউগুলোতে অবশ্যই ইভেন্ট লিসেনার থাকতে হবে। উদাহরণস্বরূপ, PieChart OnCurrentItemChanged নামে একটি কাস্টম ইভেন্ট প্রকাশ করে, যা লিসেনারদের জানায় যে ব্যবহারকারী একটি নতুন পাই স্লাইসে ফোকাস করার জন্য পাই চার্টটি ঘুরিয়েছেন।

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

প্রবেশগম্যতার জন্য ডিজাইন

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

  • android:contentDescription অ্যাট্রিবিউট ব্যবহার করে আপনার ইনপুট ফিল্ডগুলোকে লেবেল করুন।
  • প্রয়োজন অনুযায়ী sendAccessibilityEvent() কল করে অ্যাক্সেসিবিলিটি ইভেন্ট পাঠান।
  • ডি-প্যাড বা ট্র্যাকবলের মতো বিকল্প কন্ট্রোলার সমর্থন করে।

অ্যাক্সেসযোগ্য ভিউ তৈরি করার বিষয়ে আরও তথ্যের জন্য, “অ্যাপগুলিকে আরও অ্যাক্সেসযোগ্য করুন” দেখুন।