onConfigurationChanged ไม่ได้ถูกเรียก


141

เช้านี้ฉันเกิดปัญหาขึ้นกับพยายามจัดการกับonConfigurationChangedเหตุการณ์ ปัญหาคือว่าวิธีการที่ฉันแทนที่ไม่ได้รับการเรียกเมื่อฉันเปลี่ยนทิศทางของโทรศัพท์ ไม่ได้รับการโทรเลย

ฉันได้ทำandroid:configChanges="orientation"กิจกรรมที่กำหนดไว้ในรายการตามที่ระบุไว้ในเอกสารประกอบ android แต่สิ่งนี้ไม่ได้สร้างความแตกต่าง

คุณเกิดปัญหานี้ขึ้นหรือไม่?


1
ฉันมีปัญหาเดียวกันสำหรับ android: configChanges = "keyboardHidden" - onConfigurationChanged ไม่ได้รับการเรียกใช้เมื่อคีย์บอร์ดนุ่มเลื่อนเข้าหรือออก
Pieter Witvoet

keyboardHidden ไม่ได้ถูกเรียกใช้โดยแป้นพิมพ์ซอฟต์แวร์โดยเฉพาะกับแป้นพิมพ์ฮาร์ดแวร์เช่นแป้นพิมพ์แบบเลื่อนบน Droid
nmr

10
คุณควรเพิ่ม "screenSize" ในandroid:configChanges นี่คือสิ่งที่ google javadoc กล่าวว่า: Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
Ektos974

@ Ektos974 ยอดเยี่ยม! การเพิ่มขนาดหน้าจอได้รับการกำหนดค่าการเปลี่ยนแปลง!
Manuela

สวัสดีฉันใช้ธีม Theme.Holo.Light.NoActionBar สำหรับกิจกรรมนี้ของฉันเริ่มต้นใหม่ มีวิธีใดที่จะหลีกเลี่ยงกิจกรรมที่จะเริ่มต้นใหม่ได้หรือไม่
Manukumar

คำตอบ:


250

นี่คือโสมของฉันสำหรับปัญหาเดียวกัน ~:

ข้อควรระวัง: เริ่มต้นด้วย Android 3.2 (ระดับ API 13) "ขนาดหน้าจอ" จะเปลี่ยนไปเมื่ออุปกรณ์สลับระหว่างแนวตั้งและแนวนอน ดังนั้นหากคุณต้องการป้องกันการเริ่มต้นใหม่เนื่องจากการเปลี่ยนแปลงการวางแนวเมื่อพัฒนาสำหรับระดับ API 13 หรือสูงกว่า (ตามที่ประกาศโดยแอ็ตทริบิวต์ minSdkVersion และ targetSdkVersion) คุณต้องรวมค่า "screenSize" เพิ่มเติมจากค่า "การวางแนว" นั่นคือคุณจะต้องเป็น android: configChanges = "ปฐมนิเทศ | screenSize" อย่างไรก็ตามหากแอปพลิเคชันของคุณกำหนดเป้าหมาย API ระดับ 12 หรือต่ำกว่ากิจกรรมของคุณจะจัดการกับการเปลี่ยนแปลงการกำหนดค่านี้เสมอ (การเปลี่ยนแปลงการกำหนดค่านี้จะไม่เริ่มกิจกรรมของคุณใหม่แม้ในขณะที่ทำงานบนอุปกรณ์ Android 3.2 หรือสูงกว่า)

(จากhttp://developer.android.com/guide/topics/resources/runtime-changes.html )

TL; DR: เพิ่ม "| screenSize" เพื่อกำหนดค่าการเปลี่ยนแปลงเมื่อกำหนดเป้าหมายระดับ API 13+


9
ว้าวแค่คุณลักษณะเดียวที่จะเพิ่มและด่านั่นคือทั้งหมด+1จากด้านข้างของฉัน"screenSize"มันเป็น
Anuj

@philipp สิ่งที่การตั้งค่าการวางแนวเพื่อให้บรรลุเซ็นเซอร์? ไม่แน่ใจว่าจะเป็นประโยชน์อย่างไร ขอบคุณสำหรับการแก้ไข
nmr

4 ปีต่อมาผู้คนยังคงถูกกัดโดยสิ่งนี้ :)
Daniel Wilson

ขอบคุณ ใช้เวลา 30 นาทีกระแทกหัวของฉันกับผนัง
lagos

นี่เป็นทางออกที่สมบูรณ์แบบ
Anbarasu Chinna

40

อุปกรณ์บางรุ่น 4.0 ไม่เรียกใช้การตั้งค่าเปลี่ยนแปลง เพียงเพิ่มผู้ฟังลงใน screenSize ด้วย

android:configChanges="orientation|screenSize"

นี่เป็นการแก้ไขปัญหาของฉัน การเอาชนะการonConfigurationChangedทดสอบConfiguration.ORIENTATION_LANDSCAPEและรวมถึงเฉพาะandroid:configChanges="orientation"ในรายการไม่เพียงพอสำหรับแท็บเล็ต Nexus 7 ของฉัน ขอบคุณ
Jantzilla

37

ปัญหาคือว่าถ้าคุณใช้วิธีนี้

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

เพื่อบังคับให้วางแนวของคุณActivityเป็นโหมดแนวตั้งคุณไม่ได้รับorientationการสมัครรับการเปลี่ยนแปลง

ดังนั้นการแก้ปัญหาคือไม่setRequestOrientationไปที่โหมดเฉพาะ แต่แทนที่จะใช้SCREEN_ORIENTATION_SENSOR.


5
ใช่มันใช้งานได้ แต่ถ้าฉันไม่ต้องการให้แอปของฉันหมุน ฉันต้องการให้อยู่ในโหมดแนวนอน
stoefln

คุณต้องระบุ <กิจกรรม android: name = ". MyActivity" android: screenOrientation = "landscape"> </activity> ในไฟล์ Menifest ของคุณ
Qadir Hussain

3
ฉันจะใช้ทั้งสองวิธีนี้อย่างไร (เมื่อผู้ใช้คลิก "เต็มหน้าจอ" บนเครื่องเล่นวิดีโอ) และรับอย่างต่อเนื่องonConfigChangedเช่นกันเมื่อผู้ใช้หมุนโทรศัพท์ของเขา พฤติกรรมเช่นเดียวกับในแอป YouTube เป็นไปได้นี้?
Vucko

29

ตรวจสอบว่าอุปกรณ์ของคุณมีการตั้งค่า "หมุนหน้าจอ"

การตั้งค่า "การหมุนหน้าจอ"


7
ฉันมีปัญหาตลกนี้ ... : D
Dharmendra

เป็นไปได้ไหมที่จะหมุนกิจกรรมแม้ว่าตัวเลือก "การหมุนหน้าจอ" จะปิดอยู่หรือไม่ ถ้าใช่โปรดบอกฉันว่าจะทำอย่างไร ...... ? ตามความเข้าใจของฉันมันจะไม่ทำงาน แต่แอพพลิเคชั่นบางตัวหมุนกิจกรรมเป็นแนวนอน
Srinivasan

1
เซนต์!!! ใช้เวลา 4-5 ชั่วโมงในการพยายามให้โค้ดทำงาน วิธีที่จะเอาชนะสิ่งนี้ในขณะที่ฉันเรียนรู้จากคำตอบอื่นคือการรวม <android: ปฐมนิเทศ = "sensor"> ในรายการ
suku

19
  1. ตรวจสอบว่าคุณไม่ได้ใช้android:screenOrientationในActivityหรือในApplicationระดับ
  2. ลองใช้android:configChanges="orientation|keyboardHidden"แทน

1
ฉันจะใช้ android ได้อย่างไร: screenOrientation และฉันต้องการที่จะใช้วิธีการกำหนดค่าการเปลี่ยนแปลงฉันจะทำอย่างไรขอบคุณ
Bingchean

17

ฉันใช้เวลาหลายสิบนาทีเพื่อค้นหาว่าทำไมมันไม่ทำงาน ฉันเพิ่มscreenSizeแต่ก็ยังไม่ทำงาน

ปรากฎว่าฉันได้เพิ่มandroid:configChangesเข้าไปใน<application>องค์ประกอบไม่ใช่<activity>องค์ประกอบที่ฉันควรมี!

แน่นอนว่านี่เป็นความผิดพลาดของฉัน แต่เราทุกคนรู้ว่าเราทุกคนใช้เวลามากกับความผิดพลาดแบบนี้ ดังนั้นฉันกำลังเพิ่มคำตอบนี้ในกรณีที่ควรมีโปรแกรมเมอร์โง่อีกเช่นฉัน


ฉันก็ทำเช่นเดียวกันขอบคุณคุณช่วยฉันด้วย
Pranoy Sarkar

ขอบคุณมากครับโฮ!
Laurent

14

Macarse เป็นเงิน 100% กับทางเลือกที่สองของเขา

ลอง android:configChanges="orientation|keyboardHidden|screenSize"

ฉันมีปัญหาเดียวกันทุกkeyboardHiddenประการและในการเพิ่มตัวจำลอง 1.6 สาเหตุonConfigurationChangedที่ถูกเรียกระหว่างการหมุน ลบออกและหยุดการโทร


5

ฉันมีปัญหาเดียวกัน - onConfigurationChangedไม่ได้ถูกเรียกว่าเมื่ออุปกรณ์เปลี่ยนทิศทางแม้จะมีandroid:configChanges="orientation|keyboardHidden"อยู่ในแฟ้มที่ประจักษ์ ฉันใช้รหัสที่ถูกแบ่งปันโดยDevaที่นี่

การวางแนวไม่ทำงานใน 2.3.3?

เพื่อตรวจสอบว่าonConfigurationChangedมีการโทรหรือไม่ มันไม่ใช่

หลังจากการทดลองสองสามชั่วโมงฉันรู้ว่าฉันมีบรรทัดต่อไปนี้ในไฟล์รายการ

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15"/>

และเกี่ยวกับการเปลี่ยนandroid:targetSdkVersion="15"ไปandroid:targetSdkVersion="8", onConfigurationChangedเริ่มถูกเรียกว่า ดังนั้นส่วนหนึ่งของรายการจึงดูเหมือนเป็นเช่นนี้

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>

9
ปัญหาที่คุณมีคือหน้าจอที่หายไป: screenize โปรดอัปเดตคำตอบของคุณ นี่จะเป็น "แก้ไข" ที่ทำให้เข้าใจผิดสำหรับผู้เริ่มต้นและนักพัฒนาซอฟต์แวร์
Tobrun

@ user1281750 ขอบคุณ แต่ในฐานะผู้เริ่มต้นพัฒนา Android เองฉันไม่แน่ใจว่าคุณกำลังพูดอะไรอยู่
aLearner

@ aLearner ฉันคิดว่า user1281750 หมายถึงอะไร: นี่ไม่ใช่การแก้ไข! ถ้าคุณต้องการรุ่น SDK ที่สูงขึ้น
AgentKnopf

ฉันแบ่งปันสิ่งที่ได้ผลกับฉัน ฉันรู้ว่านี่อาจไม่ใช่การแก้ไข 'การ' แต่ทางเลือกคืออะไร ทางออก 'ถูกต้อง' คืออะไร และสิ่งที่ 'หายไปattribute: screensize' หมายถึงอะไร? อาจเป็นประโยชน์หากมีการให้รายละเอียดเพิ่มเติม
aLearner

ขอบคุณเพื่อนโซลูชันนี้แก้ไขความตึงเครียดครั้งใหญ่ของฉันฮ่า ๆ ๆ ๆ ๆ ๆ .. ฉันกำลังใช้เวลาหนึ่งชั่วโมงเพื่อรับมัน ... มันใช้งานได้ในเวอร์ชั่นที่อัปเดตทั้งหมดด้วย
Sampath Kumar

3

ฉันเพิ่งพบว่าถ้าคุณมี:

android:screenOrientation="landscape"

ในรายการ onConfigurationChanged () จะไม่ถูกเรียกเช่นกัน ...

สิ่งนี้อาจคล้ายกับ:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

การตั้งค่าการวางแนวบล็อก onConfigurationChanged ()


3
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

อย่าใช้รุ่น SDK เป้าหมายใด ๆเพื่อให้คุณมีความซับซ้อน และสำหรับทุกระดับ API ให้ใช้สิ่งนี้เป็นผู้ฟังการเปลี่ยนแปลงการกำหนดค่า

android:configChanges="orientation|keyboardHidden|screenLayout"

3

ไม่แน่ใจว่านี่เป็นสถานที่ที่ดีที่สุด แต่ในการเผชิญหน้ากับปัญหานี้ - ฉันสังเกตเห็นบางสิ่งที่น่าสนใจ

หากผู้ฟังonConfigurationChanged ()ไม่ทำงานดังนั้น onCreate () จะถูกเรียกอีกครั้งทุกครั้งที่มีการเปลี่ยนทิศทาง

หากผู้ฟังonConfigurationChanged ()ทำงานวิธีการนั้นจะถูกเรียกใช้แทน onCreate () เมื่อการวางแนวเปลี่ยนไป


นี่คือสิ่งที่ฉันเห็น - แต่ฉันไม่ต้องการที่จะเป็น และตามเอกสารมันไม่ควรเกิดขึ้นแบบนี้ ทำให้งง
slycrel

2

โซลูชันทั้งหมดใช้งานไม่ได้ฉันพยายามลบกิจกรรมธีมของฉันในไฟล์รายการ Android แปลกมาก

<activity
        android:name="MyActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@style/MyTheme" --> remove this line
        />



<style name="MyTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

เป็นวิธีการหลีกเลี่ยงกิจกรรมที่จะเริ่มต้นใหม่โดยไม่ต้องลบ windowNoTitle?
Manukumar

2

ข้อเสนอแนะไม่ทำงานสำหรับฉัน (ฉันมีปฏิกิริยาพื้นเมืองโครงการกับปัญหานี้) แต่หลังจากชั่วโมงของการแก้จุดบกพร่องฉันพบว่าถ้าคุณมีบรรทัดนี้ใน AppTheme of styles.xml

<item name="android:windowIsTranslucent">true</item>

จากนั้นแอปจะไม่หมุน


1

@ thanhbinh84 ทำให้ฉันมีความคิดในสิ่งที่อาจทำให้เกิดสิ่งนี้
การลบออก <item name="android:windowIsTranslucent">true</item> จากธีมของฉันใน styles.xml ได้แก้ไขแล้ว!


0

ฉันมีปัญหาเดียวกันและฉันมีทั้ง "android: screenOrientation" และ "android: configChanges" ที่ระบุในรายการ เมื่อฉันลบอันแรก onConfigurationChanged () ถูกเรียกเมื่อหมุน แปลก แต่มันก็กระทะ)


1
แต่คุณจะหมุนได้อย่างไร
Mark Molina

-2

คุณได้รับandroid.content.res.Configurationในงบการนำเข้าของคุณ? Ctrl+Shift+Oคราสสามารถแทรกการนำเข้าโดยอัตโนมัติหากคุณกด

หากขาดหายไปคอมไพเลอร์จะไม่สามารถรับรู้ได้ว่าคุณกำลังเอาชนะวิธี Superclass อย่างถูกกฎหมายและจะทำให้เกิดข้อผิดพลาด


ใช่การนำเข้ามีอยู่แล้วความคิดใด ๆ เพราะฉันไม่ได้รับข้อผิดพลาดหรืออะไรเลยมันเป็นแค่สิ่งที่ไม่ได้รับการเรียก
lblasa

ฉันไม่รู้ว่าสิ่งนี้อาจเกี่ยวข้องกับความจริงที่ว่าแอปพลิเคชันทั้งหมดกำลังทำในโหมดแนวตั้ง กิจกรรมที่ฉันต้องจัดการกับ onConfigurationChangedEvent เป็นกิจกรรมที่มีอยู่ใน TabHost ซึ่งโหมดเป็นแนวตั้ง แต่อย่างไรก็ตามฉันไม่พบความคิดเห็นใด ๆ เกี่ยวกับเรื่องนี้ซึ่งเป็นปัญหาสำหรับการติดตามเหตุการณ์นั้น ฉันคิดไม่ออกจริงๆ
lblasa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.