ฉันตรวจสอบปัญหานี้แล้วโดยอ้างถึงLayoutInflater docsและตั้งค่าโครงการสาธิตตัวอย่างขนาดเล็ก LayoutInflater
แสดงให้เห็นว่าบทเรียนต่อไปนี้วิธีการแบบไดนามิกเติมรูปแบบโดยใช้
ก่อนที่เราจะเริ่มต้นดูว่าLayoutInflater.inflate()
พารามิเตอร์มีลักษณะอย่างไร:
- ทรัพยากร : รหัสสำหรับทรัพยากรรูปแบบ XML ที่จะโหลด (เช่น
R.layout.main_page
)
- root : มุมมองทางเลือกที่จะเป็นพาเรนต์ของลำดับชั้นที่สร้างขึ้น (ถ้า
attachToRoot
มีtrue
) หรืออื่น ๆ เป็นเพียงวัตถุที่มีชุดของLayoutParams
ค่าสำหรับรูทของลำดับชั้นที่ส่งคืน (ถ้าattachToRoot
มีfalse
)
attachToRoot : ว่าควรแนบลำดับชั้นที่สูงเกินจริงกับพารามิเตอร์รูทหรือไม่? หากเป็นเท็จรูตจะใช้เพื่อสร้างคลาสย่อยที่ถูกต้องของLayoutParams
สำหรับมุมมองรูทใน XML
คืนค่า : มุมมองรูทของลำดับชั้นที่สูงเกินจริง หากรูทถูกระบุและattachToRoot
เป็นtrue
นี่คือรูท มิฉะนั้นจะเป็นรูทของไฟล์ XML ที่เกินจริง
ตอนนี้สำหรับตัวอย่างเค้าโครงและรหัส
เค้าโครงหลัก ( main.xml
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
เพิ่มลงในคอนเทนเนอร์นี้เป็น TextView แยกต่างหากซึ่งสามารถมองเห็นเป็นสี่เหลี่ยมจัตุรัสสีแดงเล็ก ๆ ได้หากใช้พารามิเตอร์โครงร่างจาก XML ( red.xml
) ได้สำเร็จ:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
ตอนนี้LayoutInflater
ใช้กับพารามิเตอร์การโทรหลายรูปแบบ
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
ผลลัพธ์ที่แท้จริงของการเปลี่ยนแปลงของพารามิเตอร์มีการบันทึกไว้ในรหัส
สรุป: การโทรLayoutInflater
โดยไม่ระบุรูตจะทำให้เกิดการโทรเกินจริงโดยไม่สนใจพารามิเตอร์โครงร่างจาก XML การเรียกใช้ inflate ด้วยรูทไม่เท่ากันnull
และattachRoot=true
โหลดพารามิเตอร์โครงร่าง แต่ส่งคืนออบเจ็กต์รูทอีกครั้งซึ่งป้องกันการเปลี่ยนโครงร่างเพิ่มเติมไปยังออบเจกต์ที่โหลด (เว้นแต่คุณจะพบว่าใช้งานfindViewById()
) ระเบียบการโทรที่คุณมักจะต้องการใช้จึงเป็นแบบนี้:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
เพื่อช่วยในเรื่องการจัดวางขอแนะนำให้ผู้ตรวจสอบเค้าโครง