ฉันพบคำถามที่คล้ายกันจำนวนมากใน SO แต่ไม่มีคำตอบที่ตรงกับความต้องการของฉัน
ฉันมีเลย์เอาต์ที่แตกต่างกันสำหรับแนวตั้งและแนวนอนและฉันใช้แบ็คสแต็กซึ่งทั้งสองป้องกันไม่ให้ฉันใช้setRetainState()
และลูกเล่นโดยใช้รูทีนการเปลี่ยนแปลงการกำหนดค่า
ฉันแสดงข้อมูลบางอย่างแก่ผู้ใช้ใน TextViews ซึ่งไม่ได้รับการบันทึกในตัวจัดการเริ่มต้น เมื่อเขียนแอปพลิเคชันของฉัน แต่เพียงผู้เดียวโดยใช้กิจกรรมสิ่งต่อไปนี้ใช้ได้ดี:
TextView vstup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever);
vstup = (TextView)findViewById(R.id.whatever);
/* (...) */
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putCharSequence(App.VSTUP, vstup.getText());
}
@Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
vstup.setText(state.getCharSequence(App.VSTUP));
}
ด้วยFragment
s สิ่งนี้ใช้ได้เฉพาะในสถานการณ์ที่เฉพาะเจาะจงเท่านั้น โดยเฉพาะสิ่งที่แตกอย่างน่ากลัวคือแทนที่ชิ้นส่วนวางไว้ในกองหลังแล้วหมุนหน้าจอในขณะที่ชิ้นส่วนใหม่จะปรากฏขึ้น จากสิ่งที่ฉันเข้าใจส่วนเก่าไม่ได้รับสายไปonSaveInstanceState()
เมื่อถูกแทนที่ แต่การเข้าพักที่เชื่อมโยงอย่างใดไปActivity
และวิธีการนี้เรียกว่าต่อมาเมื่อมันView
ไม่ได้อยู่อีกต่อไปดังนั้นมองหาใด ๆ ของฉันTextView
ผล s NullPointerException
เป็น
นอกจากนี้ฉันยังพบว่าการอ้างอิงถึงฉันTextViews
ไม่ใช่ความคิดที่ดีกับFragment
s ถึงแม้ว่ามันจะโอเคกับActivity
ก็ตาม ในกรณีนี้onSaveInstanceState()
จริง ๆ แล้วบันทึกสถานะ แต่ปัญหาปรากฏขึ้นอีกครั้งถ้าฉันหมุนหน้าจอสองครั้งเมื่อชิ้นส่วนถูกซ่อนเนื่องจากonCreateView()
ไม่ได้รับการเรียกในอินสแตนซ์ใหม่
ผมคิดว่าการออมของรัฐในonDestroyView()
เป็นบางส่วนBundle
องค์ประกอบสมาชิกระดับชนิด (เป็นข้อมูลจริงมากขึ้นไม่เพียงหนึ่งTextView
) และบันทึกว่าในonSaveInstanceState()
แต่มีข้อบกพร่องอื่น ๆ ในขั้นต้นถ้าส่วนย่อยถูกแสดงอยู่ลำดับของการเรียกฟังก์ชั่นทั้งสองจะกลับด้านดังนั้นฉันต้องพิจารณาสถานการณ์ที่แตกต่างกันสองสถานการณ์ จะต้องมีวิธีที่สะอาดและถูกต้อง!