بارگیری نماها در صورت تقاضا

گاهی اوقات چیدمان شما نیاز به نماهای پیچیده ای دارد که به ندرت از آنها استفاده می شود. خواه جزئیات مورد، نشانگرهای پیشرفت، یا لغو پیام‌ها باشند، می‌توانید با بارگیری نماها فقط در صورت نیاز، مصرف حافظه را کاهش دهید و سرعت رندر را افزایش دهید.

با تعریف 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 را بارگیری کنید

قطعه کد در بخش قبل چیزی شبیه شکل 1 را ایجاد می کند:

تصویری از یک صفحه خالی
شکل 1. وضعیت اولیه صفحه: ViewStub در حال پنهان کردن طرح سنگین است.

وقتی می‌خواهید طرح‌بندی مشخص‌شده توسط ViewStub را بارگیری کنید، آن را با فراخوانی setVisibility(View.VISIBLE) روی قابل مشاهده تنظیم کنید یا inflate() را فراخوانی کنید.

قطعه کد زیر یک بار به تعویق افتاده را شبیه سازی می کند. صفحه طبق معمول در Activity و onCreate() بارگیری می شود، سپس طرح heavy_layout_we_want_to_postpone را نشان می دهد:

کاتلین

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);
}
شکل 2. چیدمان سنگین قابل مشاهده است.

وقتی عنصر ViewStub قابل مشاهده یا باد شد، دیگر بخشی از سلسله مراتب view نیست. با طرح باد شده جایگزین می‌شود و شناسه نمای ریشه آن طرح‌بندی با ویژگی android:inflatedId ViewStub مشخص می‌شود. شناسه android:id مشخص شده برای ViewStub فقط تا زمانی معتبر است که طرح ViewStub قابل مشاهده یا باد شده باشد.

برای اطلاعات بیشتر در مورد این موضوع، به پست وبلاگ بهینه سازی با خرد مراجعه کنید.