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