ในขณะที่ @ yydl ให้เหตุผลที่น่าสนใจว่าทำไมnewInstance
วิธีการจึงดีกว่า:
หาก Android ตัดสินใจที่จะสร้าง Fragment ของคุณขึ้นใหม่ในภายหลังมันจะเรียกตัวสร้างแบบไม่มีอาร์กิวเมนต์ของแฟรกเมนต์ของคุณ ดังนั้นการสร้างมากเกินไปไม่ใช่วิธีแก้ปัญหา
ก็ยังคงเป็นไปได้มากทีเดียวที่จะใช้คอนสตรัค ในการดูว่าทำไมนี่เป็นครั้งแรกที่เราต้องดูว่าทำไม Android ใช้วิธีแก้ปัญหาข้างต้น
ก่อนที่จะสามารถใช้แฟรกเมนต์จำเป็นต้องใช้อินสแตนซ์ การเรียก Android YourFragment()
(ตัวสร้างอาร์กิวเมนต์ที่ไม่มีอาร์กิวเมนต์ ) เพื่อสร้างอินสแตนซ์ของแฟรกเมนต์ ที่นี่ตัวสร้างที่โอเวอร์โหลดที่คุณเขียนจะถูกละเว้นเนื่องจาก Android ไม่สามารถรู้ได้ว่าจะใช้อันไหน
ในช่วงชีวิตของกิจกรรมชิ้นส่วนจะถูกสร้างขึ้นดังกล่าวข้างต้นและทำลายโดย Android หลายครั้ง ซึ่งหมายความว่าหากคุณใส่ข้อมูลในชิ้นส่วนวัตถุเองมันจะหายไปเมื่อชิ้นส่วนถูกทำลาย
ในการแก้ปัญหา, Android ขอให้คุณเก็บข้อมูลโดยใช้Bundle
(เรียกsetArguments()
) YourFragment
ซึ่งจากนั้นจะสามารถเข้าถึงได้จาก อาร์กิวเมนต์bundle
s ได้รับการคุ้มครองโดย Android และด้วยเหตุนี้มีการรับประกันว่าถาวร
วิธีหนึ่งในการตั้งค่าบันเดิลนี้คือการใช้newInstance
วิธีการคงที่:
public static YourFragment newInstance (int data) {
YourFragment yf = new YourFragment()
/* See this code gets executed immediately on your object construction */
Bundle args = new Bundle();
args.putInt("data", data);
yf.setArguments(args);
return yf;
}
อย่างไรก็ตามตัวสร้าง:
public YourFragment(int data) {
Bundle args = new Bundle();
args.putInt("data", data);
setArguments(args);
}
สามารถทำสิ่งเดียวกับnewInstance
วิธีการ
ตามปกติแล้วสิ่งนี้จะล้มเหลวและเป็นหนึ่งในเหตุผลที่ Android ต้องการให้คุณใช้newInstance
วิธีนี้:
public YourFragment(int data) {
this.data = data; // Don't do this
}
เพื่อเป็นการอธิบายเพิ่มเติมต่อไปนี้เป็นคลาส Fragment ของ Android:
/**
* Supply the construction arguments for this fragment. This can only
* be called before the fragment has been attached to its activity; that
* is, you should call it immediately after constructing the fragment. The
* arguments supplied here will be retained across fragment destroy and
* creation.
*/
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}
โปรดทราบว่า Android ขอให้มีการตั้งค่าข้อโต้แย้งเฉพาะที่การก่อสร้างและรับประกันว่าสิ่งเหล่านี้จะถูกเก็บไว้
แก้ไข : ตามที่ระบุไว้ในความคิดเห็นโดย @JHH หากคุณให้ตัวสร้างที่กำหนดเองที่ต้องมีข้อโต้แย้งบางอย่างแล้ว Java จะไม่ให้ชิ้นส่วนของคุณด้วยตัวสร้างเริ่มต้นที่ไม่มี arg ดังนั้นสิ่งนี้จะทำให้คุณต้องกำหนดคอนสตรัคเตอร์หาเรื่องไม่ซึ่งเป็นรหัสที่คุณสามารถหลีกเลี่ยงได้ด้วยnewInstance
วิธีการจากโรงงาน
แก้ไข : Android ไม่อนุญาตให้ใช้ตัวสร้างที่โอเวอร์โหลดสำหรับชิ้นส่วนอีกต่อไป คุณต้องใช้newInstance
วิธีการ