บางครั้งเลย์เอาต์ต้องใช้มุมมองที่ซับซ้อนซึ่งไม่ค่อยมีการใช้งาน ไม่ว่าจะ อาจเป็นรายละเอียดรายการ สัญญาณบอกสถานะความคืบหน้า หรือการเลิกทำข้อความ คุณสามารถลด การใช้หน่วยความจำและเร่งการแสดงผลด้วยการโหลดมุมมองเฉพาะ ที่จำเป็น
คุณเลื่อนทรัพยากรการโหลดได้เมื่อมีมุมมองที่ซับซ้อนซึ่งแอป
ความต้องการในอนาคตด้วยการกำหนด
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:
เมื่อต้องการโหลดเลย์เอาต์ที่ระบุโดย 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
มองเห็นได้อย่างชัดเจนหรือพอง
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ โปรดดูบล็อกโพสต์ เพิ่มประสิทธิภาพ ด้วยต้นขั้ว