โหลดยอดดูตามคำขอ

บางครั้งเลย์เอาต์ต้องใช้มุมมองที่ซับซ้อนซึ่งไม่ค่อยมีการใช้งาน ไม่ว่าจะ อาจเป็นรายละเอียดรายการ สัญญาณบอกสถานะความคืบหน้า หรือการเลิกทำข้อความ คุณสามารถลด การใช้หน่วยความจำและเร่งการแสดงผลด้วยการโหลดมุมมองเฉพาะ ที่จำเป็น

คุณเลื่อนทรัพยากรการโหลดได้เมื่อมีมุมมองที่ซับซ้อนซึ่งแอป ความต้องการในอนาคตด้วยการกำหนด 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:

วันที่ รูปภาพหน้าจอที่ว่างเปล่า
รูปที่ 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 มองเห็นได้อย่างชัดเจนหรือพอง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ โปรดดูบล็อกโพสต์ เพิ่มประสิทธิภาพ ด้วยต้นขั้ว