চাহিদা অনুযায়ী ভিউ লোড করুন

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

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

ViewStub ডিফাইন করা

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

ধরুন, আপনার অ্যাপে ব্যবহারকারীর অভিজ্ঞতার পরবর্তী কোনও ধাপে আপনি একটি লেআউট লোড করতে চান:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:src="@drawable/logo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

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

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ViewStub
    android:id="@+id/stub_import"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/heavy_layout_we_want_to_postpone"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom" />
</FrameLayout>

ViewStub লেআউট লোড করুন

আগের বিভাগে দেখানো কোড স্নিপেট থেকে ছবি ১-এর মতো কিছু তৈরি হয়:

একটি ফাঁকা স্ক্রিনের ছবি
ছবি ১. স্ক্রিনের প্রাথমিক অবস্থা: ViewStub ভারী লেআউট লুকিয়ে রাখছে।

আপনি যখন ViewStub-এর মাধ্যমে নির্দিষ্ট করা লেআউট লোড করতে চান, তখন হয় setVisibility(View.VISIBLE) কল করে এটি দৃশ্যমান হিসেবে সেট করুন অথবা inflate() কল করুন।

নিম্নলিখিত কোড স্নিপেট একটি স্থগিত লোড সিমুলেট করে। Activity এবং onCreate()-এ স্ক্রিনটি স্বাভাবিকভাবে লোড হয়, তারপর এটি heavy_layout_we_want_to_postpone লেআউট দেখায়:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_old_xml)

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000)
}

জাভা

@Override
void onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_old_xml);

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000);
}
ছবি ২. ভারী লেআউট দেখা যাচ্ছে।

একবার দৃশ্যমান বা ইনফ্লেট করা হলে, ViewStub এলিমেন্ট আর ভিউ হায়ারার্কির অংশ থাকে না। এটি ইনফ্লেটেড লেআউট দ্বারা প্রতিস্থাপিত হয় এবং সেই লেআউটের রুট ভিউয়ের আইডি ViewStub-এর android:inflatedId অ্যাট্রিবিউট দ্বারা নির্দিষ্ট করা হয়। ViewStub-এর জন্য নির্দিষ্ট করা আইডি android:id শুধুমাত্র ViewStub লেআউট দৃশ্যমান বা ইনফ্লেট না হওয়া পর্যন্ত বৈধ।

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