טעינת צפיות על פי דרישה

לפעמים הפריסה שלך דורשת תצוגות מורכבות שנעשה בהן שימוש רק לעיתים רחוקות. האם הם פרטי פריט, סמני התקדמות או ביטול הודעות, אפשר את השימוש בזיכרון והאצת העיבוד על ידי טעינת התצוגות רק כאשר הדרושים.

אפשר לדחות את טעינת המשאבים כשיש תצוגות מורכבות שהאפליקציה לצרכים שלכם בעתיד באמצעות הגדרת 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:

תמונה של מסך ריק
איור 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);
}
איור 2. ניתן לראות את הפריסה המלאה.

לאחר שהאלמנט ViewStub גלוי או מנופח, הוא כבר לא חלק של היררכיית התצוגות. הוא מוחלף בפריסה המנפחת, ובמזהה של תצוגת הבסיס של הפריסה הזו מצוינת על ידי android:inflatedId של ViewStub. המזהה android:id שצוין עבור ViewStub בתוקף רק עד ViewStub שהפריסה גלויה או מנופחת.

למידע נוסף על הנושא, ראו את הפוסט בבלוג אופטימיזציה עם הדמיית קיבוע.