بار کردن نماها به‌درخواست

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

وقتی نماهای پیچیده‌ای دارید که برنامه‌تان در آینده به آن‌ها نیاز دارد، می‌توانید بار کردن منابع را با تعریف کردن 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 را نشان می‌دهد:

کاتلین

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 نمایان یا متورم شود، دیگر بخشی از سلسله‌مراتب نما نیست. با چیدمان متورم جایگزین می‌شود و شناسه نمای ریشه آن چیدمان با مشخصه android:inflatedId از ViewStub مشخص می‌شود. شناسه android:id مشخص‌شده برای ViewStub فقط تا زمانی معتبر است که چیدمان ViewStub قابل‌مشاهده یا گسترده باشد.

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