onConfigurationChanged बुलाया नहीं जा रहा है


141

आज सुबह मैं इस onConfigurationChangedघटना को संभालने की कोशिश कर रहा था । समस्या यह है कि विधि, जिसे मैं ओवरराइड करता हूं, फोन के ओरिएंटेशन को बदलने पर मुझे कॉल नहीं किया जा रहा है। बुलाया नहीं जा रहा है।

मैंने android:configChanges="orientation"प्रकट रूप में परिभाषित गतिविधि पर रखा है जैसा कि एंड्रॉइड प्रलेखन पर उल्लेख किया गया है, लेकिन इससे कोई फर्क नहीं पड़ता है।

क्या आप इस समस्या को लेकर आए हैं?


1
मुझे एंड्रॉइड के लिए समान समस्या हो रही है: configChanges = "keyboardHidden" - onConfigurationChanged को तब नहीं बुलाया जा रहा है जब सॉफ्ट कीबोर्ड स्लाइड में या बाहर हो।
पीटर विटोवेट

कीबोर्डहार्ड को सॉफ़्टवेयर कीबोर्ड द्वारा ट्रिगर नहीं किया जाता है, केवल हार्डवेयर कीबोर्ड द्वारा, Droid पर स्लाइडिंग कीबोर्ड की तरह।
nmr

10
आपको इसमें "स्क्रीनसाइज" जोड़ना चाहिए, android:configChanges यह गूगल 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 महान! स्क्रीन पर जोड़ने से कॉल ऑन हो जाता है onConfigurationChanged!
मैनुएला

नमस्ते, मैं Theme.Holo.Light.NoActionBar विषय का उपयोग कर रहा हूं। इस एक के लिए, मेरी गतिविधि पुनरारंभ हो रही है। क्या पुनः आरंभ करने के लिए गतिविधि से बचने का कोई तरीका है?
मनुकुमार

जवाबों:


250

यह मेरी ग्रेमलिन ~ के लिए एक ही समस्या थी:

सावधानी: एंड्रॉइड 3.2 (एपीआई स्तर 13) के साथ शुरुआत, "स्क्रीन का आकार" भी बदलता है जब डिवाइस पोर्ट्रेट और लैंडस्केप ओरिएंटेशन के बीच स्विच करता है। इस प्रकार, यदि आप API स्तर 13 या उच्चतर के लिए विकसित होने पर अभिविन्यास परिवर्तन के कारण रनटाइम पुनरारंभ को रोकना चाहते हैं (जैसा कि minSdkVersion और targetSdkVersion विशेषताओं द्वारा घोषित किया गया है), तो आपको "ओरिएंटेशन" मान के अतिरिक्त "स्क्रीनसेज़" मान को शामिल करना होगा। यही है, आपको android decalare करना चाहिए: configChanges = "ओरिएंटेशन | स्क्रीनसाइज़"। हालाँकि, यदि आपका एप्लिकेशन API स्तर 12 या उससे कम का लक्ष्य करता है, तो आपकी गतिविधि हमेशा इस कॉन्फ़िगरेशन परिवर्तन को संभालती है (यह कॉन्फ़िगरेशन परिवर्तन आपकी गतिविधि को पुनरारंभ नहीं करता है, भले ही एंड्रॉइड 3.2 या उच्चतर डिवाइस पर चल रहा हो)।

( Http://developer.android.com/guide/topics/resources/runtime-changes.html से )

TL, DR: "" | screenSize "को कॉन्फ़िगर करें जब एपीआई स्तर 13+ को लक्षित किया जाए


9
वाह, बस एक ही विशेषता को जोड़ा जा सकता है और सभी को धिक्कार है, +1मेरी तरफ से "screenSize"
अनुज

@philipp सेंसर प्राप्त करने के लिए अभिविन्यास की स्थापना क्या होगा? निश्चित नहीं है कि यह कैसे सहायक होगा। हालांकि संपादन के लिए धन्यवाद।
एनएमआर

4 साल बाद लोग अभी भी इस से कटे हुए हैं :)
डैनियल विल्सन

धन्यवाद। दीवार के खिलाफ मेरे सिर पर 30 मिनट बिताए।
लागोस

यह
अचूक

40

4.0 के कुछ डिवाइस ऑनकॉन्फिगरेशनचैनेज को कॉल नहीं करते हैं। स्क्रीनसेज़ करने के लिए बस एक श्रोता जोड़ें।

android:configChanges="orientation|screenSize"

इससे मेरी समस्या हल हो गई। ओवरराइडिंग onConfigurationChanged, के खिलाफ परीक्षण Configuration.ORIENTATION_LANDSCAPE, और केवल android:configChanges="orientation"प्रकट में सहित मेरे नेक्सस 7 टैबलेट के लिए पर्याप्त नहीं था। धन्यवाद
Jantzilla

37

समस्या यह थी कि यदि आप इस विधि का उपयोग करते हैं

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Activityपोर्ट्रेट मोड में अपने अभिविन्यास के लिए मजबूर करने के लिए, आप orientationपरिवर्तन प्राप्त करने के लिए उम्मीदवार नहीं हैं।

तो समाधान setRequestOrientationएक विशेष मोड के लिए नहीं है। लेकिन इसके बजाय उपयोग करेंSCREEN_ORIENTATION_SENSOR.


5
हाँ, यह काम करता है, लेकिन क्या होगा अगर मैं नहीं चाहता कि मेरा ऐप घुमाया जाए? मैं इसे लैंडस्केप मोड में रहना चाहता हूं।
stoefln

आपको अपनी गतिविधि फ़ाइल में निर्दिष्ट करना होगा <गतिविधि android: name = "। MyActivity" android: screenOrientation = "परिदृश्य"> </ गतिविधि> अपनी मेनफ़ास्ट फ़ाइल में
कादिर हुसैन

3
मैं दोनों इसका उपयोग कैसे करते हैं (जब उपयोगकर्ता वीडियो प्लेयर पर "फुलस्क्रीन" क्लिक करता है), और onConfigChangedतब भी प्राप्त करता रहता है, जब उपयोगकर्ता अपना फोन घुमाता है। Youtube ऐप में जैसा व्यवहार है। यह संभव है?
वूको

29

जांचें कि आपके डिवाइस में "स्क्रीन रोटेशन" सेटिंग है

"स्क्रीन रोटेशन" सेटिंग


7
मेरे पास यह मजेदार मुद्दा था ...: D
धर्मेंद्र

"स्क्रीन रोटेशन" विकल्प बंद होने के बावजूद क्या गतिविधि को घुमाना संभव है? यदि हां, तो कृपया मुझे बताएं कि कैसे करना है ......? मेरी समझ के अनुसार, यह काम नहीं करेगा लेकिन कुछ एप्लिकेशन गतिविधि को परिदृश्य में घुमाते हैं।
श्रीनिवासन

1
एस ** टी !!! मेरे कोड को काम करने के लिए 4-5 घंटे खर्च किए! इसे ओवरराइड करने का एक तरीका, जैसा कि मैं एक अन्य उत्तर से सीखता हूं, प्रकट में <android: ओरिएंटेशन = "सेंसर"> को शामिल करना है
suku

19
  1. जांचें कि आप android:screenOrientationएक Activityया एक Applicationस्तर में उपयोग नहीं कर रहे हैं ।
  2. android:configChanges="orientation|keyboardHidden"इसके बजाय प्रयोग करके देखें ।

1
मैं एंड्रॉइड का उपयोग कैसे कर सकता हूं: स्क्रीन ऑरिजनेशन और मैं ऑनकोनफिगरेशन को बदलना चाहता हूं विधि को चलाने के लिए, मैं क्या कर सकता हूं, thx
Bingchean

17

मैंने यह पता लगाने के लिए दस मिनट बिताए कि यह क्यों नहीं हुआ। मैंने जोड़ा screenSizeलेकिन यह अभी भी काम नहीं किया।

यह पता चला कि मैं जोड़ा था android:configChangesकरने के लिए <application>तत्व, के लिए नहीं <activity>तत्व के रूप में मैं होना चाहिए!

ठीक है, बेशक, यह मेरी गलती थी, लेकिन हम सभी जानते हैं कि हम सभी इस तरह की मूर्खतापूर्ण गलती के लिए बहुत समय बिताते हैं। इसलिए, मैं इस जवाब को सिर्फ इसलिए जोड़ रहा हूं कि मेरे जैसा एक और मूर्खतापूर्ण प्रोग्रामर होना चाहिए।


मैं भी यही कर रहा हूं, धन्यवाद आपने मुझे बचा लिया
प्रणॉय सरकार

हो थैंक्स दोस्त!
लॉरेंट

14

अपने दूसरे विकल्प के साथ पैसे पर मैकरस 100% है।

प्रयत्न android:configChanges="orientation|keyboardHidden|screenSize"

मेरे पास वास्तव में एक ही मुद्दा था, और 1.6 एमुलेटर को जोड़ने के keyboardHiddenकारण onConfigurationChangedरोटेशन के दौरान कहा जाता है। इसे हटा दें और इसे बुलाया जाना बंद हो जाता है।


5

मेरे पास एक ही समस्या थी - onConfigurationChangedजब डिवाइस को अभिविन्यास फ़ाइल में होने के बावजूद अभिविन्यास में परिवर्तन नहीं किया गया था android:configChanges="orientation|keyboardHidden"। मैंने Devaयहां साझा किए गए कोड के स्निप का उपयोग किया

में काम नहीं कर रहा है?

यह जाँचने के लिए कि 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
आपके पास जो समस्या है वह अनुपलब्ध है: स्क्रीनसेवर। कृपया अपना उत्तर अपडेट करें। यह andriod Developers के लिए एक भ्रामक "फिक्स" होगा
Tobrun

@ user1281750 धन्यवाद, लेकिन एक शुरुआत के रूप में Android डेवलपर खुद मुझे यकीन नहीं है कि यह क्या है आप बिल्कुल कह रहे हैं।
20

@aLearner मुझे लगता है कि user1281750 का क्या मतलब है: यह वास्तव में एक फिक्स नहीं है! यदि आपको उच्च एसडीके संस्करण की आवश्यकता है तो क्या होगा?
AgentKnopf

मैंने जो मेरे लिए काम किया उसे साझा किया। मुझे एहसास है कि यह 'ठीक' नहीं हो सकता है। लेकिन विकल्प क्या है? 'सही' समाधान क्या है? और 'लापता attribute: screensize' का क्या मतलब है ? यदि अधिक विवरण प्रदान किया जाता है तो यह सहायक हो सकता है।
अनलेर

धन्यवाद दोस्त इस समाधान ने मेरे बड़े तनाव को हल किया .. मैं इसे प्राप्त करने के लिए एक घंटे के लिए सर्फिंग कर रहा था ... इसके अद्यतन संस्करणों में भी काम कर रहा था
संपत कुमार

3

मैंने पाया कि यदि आपके पास है:

android:screenOrientation="landscape"

मेनिफेस्ट में onConfigurationChanged () भी नहीं कहा जाएगा ...

यह इस तरह हो सकता है:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

कि सेटिंग अभिविन्यास ब्लॉक onConfigurationChanged ()।


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

आपको जटिलता बनाने के लिए किसी भी लक्ष्य एसडीके संस्करणों का उपयोग न करें । और सभी एपीआई स्तरों के लिए इसका उपयोग विन्यास परिवर्तन श्रोता के रूप में करते हैं

android:configChanges="orientation|keyboardHidden|screenLayout"

3

सुनिश्चित नहीं है कि यह इसके लिए सबसे अच्छी जगह है, लेकिन इस मुद्दे का सामना करने में - मैंने कुछ दिलचस्प देखा।

यदि onConfigurationChanged () श्रोता काम नहीं कर रहा है, तो प्रत्येक बार अभिविन्यास बदलने के बाद onCreate () को फिर से कहा जाता है।

यदि onConfigurationChanged () श्रोता काम कर रहा है, तो ओरिएंटेशन बदलने पर ऑनक्रिएट () के बजाय उस विधि को कहा जाता है।


यह वही है जो मैं देख रहा हूं - लेकिन मैं बनना नहीं चाहता। और डॉक्स के अनुसार यह इस तरह नहीं होना चाहिए। इतना अधिक भ्रामक।
slycrel

2

सभी समाधान काम नहीं करते हैं मैं एंड्रॉइड मेनिफ़ेस्ट फ़ाइल में अपनी थीम गतिविधि को निकालने का प्रयास करता हूं। कितना अजीब

<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>

क्या खिड़की को हटाने के बिना पुनरारंभ करने के लिए गतिविधि से बचने का कोई तरीका है?
मनुकुमार

2

किसी भी सुझाव ने मेरे लिए काम नहीं किया (मुझे इस मुद्दे के साथ देशी परियोजना पर प्रतिक्रिया मिली थी), लेकिन घंटों की डिबगिंग के बाद मैंने पाया कि यदि आपके पास इस लाइन की शैली में है। xml

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

फिर ऐप नहीं घूमेगा।


1

@ thanhbinh84 ने मुझे अंदाजा दिया कि इसके कारण क्या हो सकते हैं।
निकाला जा रहा है <item name="android:windowIsTranslucent">true</item> styles.xml में मेरे विषय से यह तय हो गई!


0

मेरे पास एक ही मुद्दा था और मेरे पास "एंड्रॉइड: स्क्रीनऑरिएशन" और "एंड्रॉइड: कॉन्फिगरेशन" दोनों थे, जो प्रकट में निर्दिष्ट थे। जब मैंने पहले एक को हटा दिया, onConfigurationChanged () रोटेशन पर बुलाया जाता है। अजीब लेकिन यह woks)


1
लेकिन फिर आप कैसे घूमते हैं?
मार्क मोलिना

-2

क्या आप android.content.res.Configurationअपने आयात के बयानों में मिल गए हैं? यदि आप दबाते हैं तो ग्रहण स्वचालित रूप से आयात सम्मिलित कर सकता है Ctrl+Shift+O

यदि वह गायब है, तो कंपाइलर यह पहचानने में असमर्थ होगा कि आप वैध रूप से सुपरक्लास पद्धति को ओवरराइड कर रहे हैं और इसलिए एक त्रुटि होगी।


हाँ, आयात पहले से ही है, कोई विचार? क्योंकि मुझे कोई त्रुटि या कुछ भी नहीं मिल रहा है, यह सिर्फ इतना ही नहीं कहा जा रहा है।
लब्सा

मुझे नहीं पता कि क्या यह इस तथ्य से संबंधित हो सकता है कि सभी आवेदन पोर्ट्रेट मोड में किए जा रहे हैं। जिस गतिविधि में मुझे onConfigurationChangedEvent को संभालने की आवश्यकता है वह एक गतिविधि है जिसमें एक टैबहॉस्ट शामिल है जो मोड पोर्ट्रेट है। लेकिन वैसे भी, मुझे इस घटना को पकड़ने के लिए कोई समस्या नहीं है। मैं वास्तव में विचारों से बाहर हूं।
लबलसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.