ฉันเขียนคำตอบนี้เพราะแม้หลังจากผ่านหน้า StackOverflow หลายหน้าฉันไม่สามารถเข้าใจได้อย่างชัดเจนว่า ด้านล่างเป็นวิธีพอง () ในคลาส LayoutInflater
View inflate (int resource, ViewGroup root, boolean attachToRoot)
ลองดูที่activity_main.xmlไฟล์button.xmlรูปแบบและMainActivity.javaฉันไฟล์ที่สร้าง
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
button.xml
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = getLayoutInflater();
LinearLayout root = (LinearLayout) findViewById(R.id.root);
View view = inflater.inflate(R.layout.button, root, false);
}
เมื่อเราเรียกใช้รหัสเราจะไม่เห็นปุ่มในเค้าโครง นี่เป็นเพราะรูปแบบปุ่มของเราไม่ได้ถูกเพิ่มเข้าไปในเค้าโครงกิจกรรมหลักเนื่องจาก attachToRoot ถูกตั้งค่าเป็นเท็จ
LinearLayout มีเมธอด addView (มุมมองมุมมอง)ซึ่งสามารถใช้เพื่อเพิ่ม Views ไปยัง LinearLayout สิ่งนี้จะเพิ่มเค้าโครงปุ่มลงในเค้าโครงกิจกรรมหลักและทำให้ปุ่มปรากฏเมื่อคุณเรียกใช้รหัส
root.addView(view);
ลองลบบรรทัดก่อนหน้าและดูว่าเกิดอะไรขึ้นเมื่อเราตั้ง attachToRoot เป็นจริง
View view = inflater.inflate(R.layout.button, root, true);
อีกครั้งเราจะเห็นว่ารูปแบบปุ่มสามารถมองเห็นได้ นี่เป็นเพราะ attachToRoot แนบเค้าโครงที่พองตัวกับแม่ที่ระบุโดยตรง ซึ่งในกรณีนี้คือรูท LinearLayout ที่นี่เราไม่จำเป็นต้องเพิ่มมุมมองด้วยตนเองเหมือนที่เราทำในกรณีก่อนหน้าด้วยวิธีการ addView (มุมมองมุมมอง)
เหตุใดผู้คนจึงได้รับ IllegalStateException เมื่อตั้งค่า attachToRoot ว่าเป็นจริงสำหรับ Fragment
นี่เป็นเพราะแฟรกเมนต์คุณได้ระบุตำแหน่งที่จะวางโครงร่างแฟรกเมนต์ของคุณในไฟล์กิจกรรมของคุณ
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.root, fragment)
.commit();
การเพิ่ม (int parent แฟรกเมนต์แฟรกเมนต์)เพิ่มแฟรกเมนต์ที่มีโครงร่างไปยังโครงร่างพาเรนต์ หากเราตั้ง attachToRoot เป็นจริงคุณจะได้รับ IllegalStateException: เด็กที่ระบุมี parent แล้ว เนื่องจากเลย์เอาต์ของแฟรกเมนต์ถูกเพิ่มไปยังเค้าโครงพาเรนต์ในเมธอด add ()
คุณควรส่ง false สำหรับ attachToRoot เสมอเมื่อคุณขยายแฟรกเมนต์ เป็นหน้าที่ของ FragmentManager ที่จะเพิ่มลบและแทนที่ Fragments
กลับไปที่ตัวอย่างของฉัน ถ้าเราทำทั้งสองอย่าง
View view = inflater.inflate(R.layout.button, root, true);
root.addView(view);
ในบรรทัดแรก LayoutInflater แนบเค้าโครงปุ่มกับเค้าโครงรูทและส่งกลับวัตถุมุมมองซึ่งมีเค้าโครงปุ่มเหมือนกัน ในบรรทัดที่สองเราเพิ่มวัตถุมุมมองเดียวกันลงในเค้าโครงรูทหลัก ผลลัพธ์นี้ใน IllegalStateException เดียวกับที่เราเห็นด้วย Fragments (ชายด์ที่ระบุมี parent แล้ว)
โปรดจำไว้ว่ามีวิธีการเติมข้อมูลเกินพิกัดอีกอันหนึ่งซึ่งตั้งค่า attachToRoot เป็นจริงตามค่าเริ่มต้น
View inflate (int resource, ViewGroup root)