एंड्रॉइड, जब मैं डिवाइस को घुमाता हूं तो गतिविधि को कैसे नष्ट नहीं किया जाए?


81

मेरे पास एक ऐप है जो केवल पोर्ट्रेट मोड में काम करता है, और मैंने पोर्ट्रेट होने के लिए हर गतिविधि के लिए अपनी मैनिफ़ेस्ट फ़ाइल में परिवर्तन किए हैं। लेकिन जब मैं डिवाइस को घुमाता हूं, तो गतिविधि फिर से हो जाती है। गतिविधि को कैसे नष्ट न करें?


1
इसके खिलाफ अक्सर सलाह दी जाती है, आप अपने एप्लिकेशन ओरिएंटेशन को प्रोग्रामेटिक रूप से कुछ इस तरह सेट करने की कोशिश कर सकते हैं: setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
स्टील्कॉप्टर

7
इसके खिलाफ क्यों होगा? मान लीजिए कि हमारे पास एक ऐसी सेवा है जिसे चलाने में 2 सेकंड का समय लगता है। यदि गतिविधि हर बार नष्ट हो जाती है, तो वह सेवा हर बार चलती रहती है जबकि मुझे सिर्फ एक बार चलाने की आवश्यकता होती है।
मोहम्मद मंसूर

जवाबों:


131

के लिए एपीआई 12 और नीचे : ऐड

android:configChanges="orientation"

यदि आप API 13 या इसके बाद के संस्करण को लक्षित कर रहे हैं तो "स्क्रीनसाइज़" जोड़ें क्योंकि जब भी आपका अभिविन्यास बदलता है तो आपकी स्क्रीन का आकार बदल जाता है, अन्यथा नए उपकरण आपकी गतिविधि को नष्ट करते रहेंगे। "स्क्रीनसाइज़" का उपयोग करने के बारे में अधिक जानकारी के लिए अंडे का उत्तर नीचे देखें

android:configChanges="orientation|screenSize"

AndroidManifest.xml में अपनी गतिविधि के लिए। इस तरह आपकी गतिविधि फिर से शुरू हो जाएगी। अधिक जानकारी के लिए दस्तावेज़ देखें


गतिविधि फिर से शुरू हो जाती है। मुझे नहीं पता कि गतिविधि को घुमाए जाने के दौरान किए जाने वाले सभी सामानों को करने का क्या मतलब है, भले ही यह वस्तुतः घूर्णन न कर रहा हो। क्या उस संदेश को अक्षम करने का एक तरीका है जो सेंसर ओएस को रोटेशन के बारे में भेजता है, या ऐसा कुछ है, जो इस समस्या को अपनी जड़ से ठीक करने के लिए है?
वासिल

6
आप किस डिवाइस पर प्रोग्रामिंग कर रहे हैं? याद है, कि कुंजीपटल बाहर फिसलने उदाहरण के लिए भी अपनी गतिविधि को पुनः आरंभ कर सकते हैं ... (यदि है कि करने के लिए "कुंजीपटल | keyboardHidden | उन्मुखीकरण" कारण सेट confChanges है)

2
यह लेआउट परिवर्तन को अक्षम करता है। मुझसे इसका समाधान किस प्रकार होगा?
रेमियान8985

1
यह समाधान विनाश और गतिविधि को हल करता है लेकिन, लेआउट परिवर्तनों को कैसे संभालना है। मेरे कहने का मतलब है कि जब ओरिएंटेशन बदलता है, तो संबंधित लेआउट लोड करना।
संदीपरामाराम

क्या एंड्रॉइड सेट करने का एक तरीका है: मैक्रोफ़ॉर्म पैरामीटर को प्रोग्रामेटिक रूप से, जैसा कि मैनिफ़ेस्ट फ़ाइल में विरोध किया गया है?
CodyF

108

आधिकारिक दस्तावेज से फ्लिन ने कहा,

नोट: यदि आपका एप्लिकेशन एपीआई स्तर 13 या उच्चतर (जैसा कि मिन्सडेकवर्सन और टार्गेटवेडवर्जन विशेषताओं द्वारा घोषित किया गया है) को लक्षित करता है, तो आपको "स्क्रीनसाइज़" कॉन्फ़िगरेशन भी घोषित करना चाहिए, क्योंकि यह तब भी बदलता है जब कोई उपकरण पोर्ट्रेट और लैंडस्केप ओरिएंटेशन के बीच बदल जाता है।

इसलिए यदि आपका ऐप एपीआई स्तर 13 या उच्चतर को लक्षित करता है, तो आपको इसके बजाय यह कॉन्फ़िगरेशन सेट करना चाहिए:

android:configChanges="orientation|screenSize"


4
आपको बहुत - बहुत धन्यवाद! अन्य सभी उत्तर इस भाग को याद करते हैं जहां एपीआई स्तर 13 इस स्क्रीनसेज़ चीज़ का परिचय देता है। तुमने तो मेरी जान बचा ली! :)
तमसा बार्टा

1
@egg शुक्रिया यूनुअनु! :) इससे मदद मिली!
करेनअन

1
जब आप इसे अंशकालिक करते हैं तो महान टिप प्रलेखन के साथ रखना मुश्किल होता है।
वालरजेक

1
+1 नाइस टच मैन। हमारे लिए इस समाधान को साझा करने के लिए धन्यवाद। आपने मेरा दिन बचाया। धन्यवाद;)
साइमन दोरोजाक

9

सही समाधान है

android:configChanges="orientation|screenSize"

Android प्रलेखन:

वर्तमान उपलब्ध स्क्रीन आकार बदल गया है। यह वर्तमान पहलू अनुपात के सापेक्ष वर्तमान में उपलब्ध आकार में बदलाव का प्रतिनिधित्व करता है, इसलिए जब उपयोगकर्ता परिदृश्य और चित्र के बीच बदल जाएगा तो बदल जाएगा। हालाँकि, यदि आपका एप्लिकेशन API स्तर 12 या उससे कम को लक्षित करता है, तो आपकी गतिविधि हमेशा इस कॉन्फ़िगरेशन परिवर्तन को संभालती है (यह कॉन्फ़िगरेशन परिवर्तन आपकी गतिविधि को पुनरारंभ नहीं करता है, भले ही एंड्रॉइड 3.2 या उच्चतर डिवाइस पर चल रहा हो)। * *


5

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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application> 

2
आपको एक छवि के बजाय अपने पोस्ट के भीतर कोड साझा करना चाहिए।
जूल्स डुपोंट

कृपया अपनी पोस्ट को संपादित करें और स्क्रीनशॉट के बजाय वास्तविक प्रकट कोड को पाठ के रूप में दिखाएं। दूसरे आपकी छवियों से कॉपी और पेस्ट नहीं कर सकते। विवरण के लिए यहाँ देखें। धन्यवाद।
पैंग

1

अब जब Android विभाजित स्क्रीन (एंड्रॉइड पार्लियामेंट में "मल्टी-विंडो") का समर्थन करता है, तो आप शायद स्क्रीन जोड़ना चाहेंगे। smallestScreenSize | screenLayout | ओरिएंटेशन भी। तो रोटेशन और स्प्लिट स्क्रीन को संभालने के लिए आप एंड्रॉइड में कुछ इस तरह चाहते हैं: configChanges

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>


-1

मेनिफेस्ट में लिखें:

android:configChanges="orientation|screenSize|keyboardHidden"

और आपकी समस्या को हल करने वाली गतिविधि में इसे ओवरराइड करें:

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
}

5
क्यों onConfigurationChanged विधि को ओवरराइड करना और मूल कार्यान्वयन को कुछ भी उपयोगी बनाने के लिए कॉल करना होगा?
रिकोसिरेलेम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.