ในกรณีที่ใช้กับ dev รุ่นใหม่ ๆ เนื่องจากไม่ได้ระบุไว้ข้างต้น เพื่อให้ชัดเจนมาก:
คุณต้องมีสองสิ่งหากใช้onConfigurationChanged :
onConfigurationChangedวิธีการในกิจกรรมการเรียนของคุณ
ระบุในรายการของคุณว่าวิธีการของคุณจะจัดการการเปลี่ยนแปลงการกำหนดค่าใดonConfigurationChanged
ตัวอย่างรายการในคำตอบข้างต้นในขณะที่ไม่ต้องสงสัยเลยว่าถูกต้องสำหรับแอปเฉพาะที่เป็นของ manifest ไม่ใช่สิ่งที่คุณต้องเพิ่มในรายการเพื่อเรียกใช้เมธอด onConfigurationChanged ในคลาสกิจกรรมของคุณ เช่นรายการด้านล่างอาจไม่ถูกต้องสำหรับแอปของคุณ
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
ในรายการไฟล์ Manifest ด้านบนมีการดำเนินการต่างๆของ Android สำหรับ android:configChanges=""ที่สามารถทริกเกอร์ onCreate ในวงจรชีวิตกิจกรรมของคุณ
สิ่งนี้สำคัญมาก - สิ่งที่ไม่ได้ระบุไว้ในรายการคือสิ่งที่เรียกใช้ onCreate ของคุณและสิ่งที่ระบุในรายการคือสิ่งที่เรียกonConfigurationChangedใช้เมธอดของคุณของคุณในคลาสกิจกรรมของคุณ
ดังนั้นคุณต้องระบุว่าการเปลี่ยนแปลง config ใดที่คุณต้องจัดการด้วยตัวเอง สำหรับ Android Encyclopedically Challenged อย่างฉันฉันใช้คำแนะนำด่วนใน Android Studio และเพิ่มในตัวเลือกการกำหนดค่าที่เป็นไปได้เกือบทั้งหมด รายชื่อทั้งหมดนี้กล่าวโดยทั่วไปว่าฉันจะจัดการทุกอย่างและ onCreate จะไม่ถูกเรียกเนื่องจากการกำหนดค่า
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
เห็นได้ชัดว่าตอนนี้ฉันไม่ต้องการจัดการทุกอย่างดังนั้นฉันจึงเริ่มกำจัดตัวเลือกข้างต้นทีละรายการ การสร้างและทดสอบแอปของฉันใหม่หลังจากการลบแต่ละครั้ง
จุดสำคัญอีกประการหนึ่ง : หากมีตัวเลือกการกำหนดค่าเพียงตัวเดียวที่ได้รับการจัดการโดยอัตโนมัติที่ทริกเกอร์ onCreate ของคุณ (คุณไม่มีอยู่ในรายการของคุณด้านบน) ตัวเลือกนั้นจะปรากฏในลักษณะดังนี้onConfigurationChangedไม่ทำงาน คุณต้องใส่สิ่งที่เกี่ยวข้องทั้งหมดลงในไฟล์ Manifest ของคุณ
ฉันลงเอยด้วย 3 ที่เริ่มต้น onCreate จากนั้นฉันทดสอบบน S10 + และฉันยังคงได้รับ onCreate ดังนั้นฉันต้องทำแบบฝึกหัดการกำจัดของฉันอีกครั้งและฉันก็ต้องการไฟล์|screenSize. ดังนั้นทดสอบบนแพลตฟอร์มที่เลือก
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
ดังนั้นคำแนะนำของฉันแม้ว่าฉันจะแน่ใจว่ามีคนเจาะรูในสิ่งนี้:
เพิ่มonConfigurationChangedวิธีการของคุณในชั้นเรียนกิจกรรมของคุณด้วย TOAST หรือ LOG เพื่อให้คุณสามารถดูได้ว่ามันทำงานเมื่อใด
เพิ่มตัวเลือกการกำหนดค่าที่เป็นไปได้ทั้งหมดในรายการของคุณ
ยืนยันว่าonConfigurationChangedวิธีการของคุณใช้ได้ผลโดยทดสอบแอปของคุณ
ลบตัวเลือกการกำหนดค่าแต่ละรายการออกจากไฟล์รายการทีละรายการทดสอบแอปของคุณหลังจากแต่ละรายการ
ทดสอบอุปกรณ์ต่างๆให้มากที่สุดเท่าที่จะทำได้
อย่าคัดลอก / วางข้อมูลโค้ดของฉันด้านบนลงในไฟล์รายการของคุณ การอัปเดต Android จะเปลี่ยนรายการดังนั้นให้ใช้คำแนะนำ Android Studio ที่แสดงขึ้นเพื่อให้แน่ใจว่าคุณได้รับทั้งหมด
ฉันหวังว่านี่จะช่วยใครบางคนได้บ้าง
onConfigurationChangedวิธีการของฉันสำหรับข้อมูลด้านล่าง onConfigurationChangedถูกเรียกในวงจรชีวิตหลังจากการวางแนวใหม่พร้อมใช้งาน แต่ก่อนที่ UI จะถูกสร้างขึ้นใหม่ ดังนั้นครั้งแรกของฉันifในการตรวจสอบการวางแนวทำงานได้อย่างถูกต้องจากนั้นชั้นที่ 2 ซ้อนกันifเพื่อดูการมองเห็นของ UI ImageView ของฉันก็ทำงานได้อย่างถูกต้องเช่นกัน
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
}
}