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