লেআউট শ্রেণিবিন্যাস অপ্টিমাইজ করুন

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

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

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

আপনার লেআউট পরিদর্শন করুন

অ্যান্ড্রয়েড এসডিকে টুলগুলোর মধ্যে লেআউট ইন্সপেক্টর টুল রয়েছে, যা আপনার অ্যাপ চলার সময় লেআউট বিশ্লেষণ করতে দেয়। এই টুলটি ব্যবহার করে লেআউটের পারফরম্যান্সের অদক্ষতাগুলো খুঁজে বের করা যায়।

লেআউট ইন্সপেক্টর আপনাকে সংযুক্ত ডিভাইস বা এমুলেটরে চলমান প্রসেসগুলো নির্বাচন করে লেআউট ট্রি প্রদর্শন করতে দেয়। প্রতিটি ব্লকের ট্র্যাফিক লাইটগুলো এর মেজার, লেআউট এবং ড্র পারফরম্যান্স নির্দেশ করে, যা আপনাকে সম্ভাব্য সমস্যা শনাক্ত করতে সাহায্য করে।

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

তালিকার একটিমাত্র আইটেম দেখানো একটি ছবি: একটি ছবি এবং দুটি উল্লম্বভাবে সারিবদ্ধ লেখা।
চিত্র ১. RecyclerView এর একটি আইটেমের ধারণাগত বিন্যাস।

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

লেআউট ইন্সপেক্টর এবং লিনিয়ার লেআউট কম্পোজিশন দেখানো একটি ছবি।
চিত্র ২। চিত্র ১-এ দেখানো লেআউটের স্তরবিন্যাস, যেখানে LinearLayout এর নেস্টেড ইনস্ট্যান্স ব্যবহার করা হয়েছে।

আপনার লেআউট সংশোধন করুন।

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

    <androidx.constraintlayout.widget.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/root"
      android:layout_width="match_parent"
      android:layout_height="52dp"
      android:background="#e4e6e4"
      android:padding="4dp">

      <ImageView
          android:id="@+id/image"
          android:layout_width="48dp"
          android:layout_height="48dp"
          android:background="#5c5c74"
          android:contentDescription="An example box"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent" />

      <TextView
          android:id="@+id/title"
          android:layout_width="0dp"
          android:layout_height="0dp"
          android:layout_marginStart="4dp"
          android:background="#745c74"
          app:layout_constraintBottom_toTopOf="@+id/subtitle"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toEndOf="@id/image"
          app:layout_constraintTop_toTopOf="parent" />

      <TextView
          android:id="@+id/subtitle"
          android:layout_width="0dp"
          android:layout_height="0dp"
          android:background="#7e8d6e"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="@id/title"
          app:layout_constraintTop_toBottomOf="@+id/title" />
  </androidx.constraintlayout.widget.ConstraintLayout>
    

নতুন বিন্যাসটি পরিদর্শন করে এইরকম দেখাচ্ছে:

3D লেআউট ইন্সপেক্টর দেখানো একটি ছবি।
চিত্র ৩. লেআউট ইন্সপেক্টর ৩ডি মোড।

এর সুবিধা বহুগুণে বেড়ে যায়, কারণ এই বিন্যাসটি তালিকার প্রতিটি আইটেমের জন্য ব্যবহৃত হয়।

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

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

লিন্ট ব্যবহার করুন

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

  • কম্পাউন্ড ড্রয়েবল ব্যবহার করুন। একটি ImageView এবং একটি TextView ধারণকারী LinearLayout কম্পাউন্ড ড্রয়েবল হিসেবে আরও দক্ষতার সাথে পরিচালনা করা যায়।
  • রুট ফ্রেম মার্জ করুন। যদি কোনো লেআউটের রুট একটি FrameLayout হয় যা ব্যাকগ্রাউন্ড বা প্যাডিং প্রদান করে না, তবে আপনি এটিকে একটি merge ট্যাগ দিয়ে প্রতিস্থাপন করতে পারেন, যা কিছুটা বেশি কার্যকর।
  • অপ্রয়োজনীয় লিফগুলো সরিয়ে ফেলুন। একটি আরও সমতল এবং কার্যকর লেআউট হায়ারার্কির জন্য, আপনি এমন একটি লেআউট সরিয়ে ফেলতে পারেন যার কোনো চাইল্ড বা ব্যাকগ্রাউন্ড নেই—যেহেতু এটি অদৃশ্য থাকে।
  • অপ্রয়োজনীয় প্যারেন্ট সরিয়ে ফেলুন। আপনি এমন একটি লেআউট সরিয়ে ফেলতে পারেন যার চাইল্ডের কোনো সিবলিং নেই, যেটি ScrollView বা রুট লেআউট নয় এবং যার কোনো ব্যাকগ্রাউন্ড নেই। আরও সমতল এবং কার্যকর লেআউট হায়ারার্কির জন্য আপনি চাইল্ড ভিউটিকে সরাসরি প্যারেন্টের মধ্যে সরিয়েও নিতে পারেন।
  • গভীর লেআউট পরিহার করুন। অতিরিক্ত নেস্টিংযুক্ত লেআউট পারফরম্যান্সের জন্য ক্ষতিকর। পারফরম্যান্স উন্নত করতে ConstraintLayout এর মতো অপেক্ষাকৃত কম গভীর লেআউট ব্যবহার করার কথা বিবেচনা করুন। লিন্ট চেকের জন্য ডিফল্ট সর্বোচ্চ গভীরতা হলো ১০।

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

এছাড়াও আপনি অ্যান্ড্রয়েড স্টুডিও-এর File > Settings > Project Settings অপশনটি ব্যবহার করে ইন্সপেকশন প্রোফাইল পরিচালনা এবং ইন্সপেকশন কনফিগার করতে পারেন। ইন্সপেকশন কনফিগারেশন পেজটি সমর্থিত ইন্সপেকশনগুলো সহ প্রদর্শিত হয়:

অ্যান্ড্রয়েড স্টুডিও ইন্সপেকশন মেনু দেখানো একটি ছবি।
চিত্র ৪. পরিদর্শন কনফিগারেশন পৃষ্ঠা।

লিন্ট স্বয়ংক্রিয়ভাবে কিছু সমস্যা সমাধান করতে পারে, অন্যগুলোর জন্য পরামর্শ দিতে পারে এবং পর্যালোচনার জন্য সরাসরি ত্রুটিপূর্ণ কোডে চলে যেতে পারে।

আরও তথ্যের জন্য, লেআউট এবং লেআউট রিসোর্স দেখুন।