לפעמים הפריסה שלך דורשת תצוגות מורכבות שנעשה בהן שימוש רק לעיתים רחוקות. האם הם פרטי פריט, סמני התקדמות או ביטול הודעות, אפשר את השימוש בזיכרון והאצת העיבוד על ידי טעינת התצוגות רק כאשר הדרושים.
אפשר לדחות את טעינת המשאבים כשיש תצוגות מורכבות שהאפליקציה
לצרכים שלכם בעתיד באמצעות הגדרת
ViewStub עבור
תצוגות מורכבות וכאלה שנעשה בהן שימוש רק לעיתים רחוקות.
הגדרת ViewStub
ViewStub היא תצוגה פשוטה, ללא מימד
לשרטט משהו או להשתתף בפריסה. לכן נדרשים כמה משאבים
כדי לניפוח ולצאת מהיררכיית תצוגות. כל ViewStub כולל
המאפיין android:layout כדי לציין את הפריסה שמתנפחת.
נניח שיש לכם פריסה שאתם רוצים לטעון מאוחר יותר בתהליך שעובר המשתמש app:
<?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 הוא
שמסתיר את הפריסה הכבדה.כשרוצים לטעון את הפריסה שצוינה על ידי 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) }
Java
@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
שהפריסה גלויה או מנופחת.
למידע נוסף על הנושא, ראו את הפוסט בבלוג אופטימיזציה עם הדמיית קיבוע.