לפעמים הפריסה שלך דורשת תצוגות מורכבות שנעשה בהן שימוש רק לעיתים רחוקות. האם הם פרטי פריט, סמני התקדמות או ביטול הודעות, אפשר את השימוש בזיכרון והאצת העיבוד על ידי טעינת התצוגות רק כאשר הדרושים.
אפשר לדחות את טעינת המשאבים כשיש תצוגות מורכבות שהאפליקציה
לצרכים שלכם בעתיד באמצעות הגדרת
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:
![תמונה של מסך ריק](https://developer.android.com/static/images/ui/viewstub_1.png?authuser=0000&hl=he)
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); }
![](https://developer.android.com/static/images/ui/viewstub_2.png?authuser=0000&hl=he)
לאחר שהאלמנט ViewStub
גלוי או מנופח, הוא כבר לא חלק
של היררכיית התצוגות. הוא מוחלף בפריסה המנפחת, ובמזהה של
תצוגת הבסיס של הפריסה הזו מצוינת על ידי android:inflatedId
של ViewStub
. המזהה android:id
שצוין
עבור ViewStub
בתוקף רק עד ViewStub
שהפריסה גלויה או מנופחת.
למידע נוסף על הנושא, ראו את הפוסט בבלוג אופטימיזציה עם הדמיית קיבוע.