अभिविन्यास में परिवर्तन होने पर एप्लिकेशन को पुनः लोड न करें


152

मुझे केवल स्क्रीन को घुमाए जाने पर बदलने के लिए कुछ भी नहीं चाहिए। मेरा ऐप एक यादृच्छिक छवि प्रदर्शित करता है जब यह पहली बार लोड होता है और डिवाइस को घुमाने के लिए किसी अन्य यादृच्छिक छवि का चयन नहीं करना चाहिए । मैं (बस) इस व्यवहार को कैसे रोक सकता हूं?


1
कोड से स्क्रीन ओरिएंटेशन लॉक करना (और संभवतः अनलॉक करना) भी संभव है। इसके लिए सिर्फ github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/…Screen.lockOrientation(this) से कॉल करें। यह अनलॉक करने की अनुमति देता है जो प्रकट नहीं होता है।
कांव-कांव

@Escobar Ceaser इस प्रश्न का उचित समाधान क्या है। इसके लिए मेरी एक ही आवश्यकता है।
10

मैं इस प्रोग्राम को कोड में करना चाहूंगा।
पोल्लरिस

जवाबों:


249

आम तौर पर ऐसा करने के तीन तरीके हैं:

  1. जैसा कि कुछ उत्तर सुझाए गए हैं, आप पहली बार बनाई जा रही अपनी गतिविधि के मामलों को अलग कर सकते हैं और इससे बहाल हो सकते हैं savedInstanceState। यह onSaveInstanceStateपैरामीटर के ओवरराइडिंग और जाँच के द्वारा किया जाता है onCreate

  2. आप अपने प्रकट में जोड़कर android:screenOrientation="portrait"(या "landscape") गतिविधि को एक अभिविन्यास में बंद कर <activity>सकते हैं।

  3. आप उस सिस्टम को बता सकते हैं जिसका मतलब है कि आप टैग android:configChanges="orientation|screenSize"में निर्दिष्ट करके अपने लिए स्क्रीन परिवर्तनों को संभाल सकते हैं <activity>। इस तरह गतिविधि को फिर से नहीं बनाया जाएगा, बल्कि इसके बजाय एक कॉलबैक प्राप्त होगा (जिसे आप अनदेखा कर सकते हैं क्योंकि यह आपके लिए उपयोगी नहीं है)।

व्यक्तिगत रूप से मैं (3) के साथ जाऊँगा। यदि आप में से किसी एक के लिए ऐप को लॉक करना निश्चित रूप से आपके साथ ठीक है, तो आप (2) के साथ भी जा सकते हैं।


13
इसलिए # 3 के लिए आप यह कह रहे हैं कि मुझे जो करना है, उस लाइन को अपने मैनिफ़ेस्ट में शामिल करें? क्योंकि यह काम नहीं करता है।
जिमी डी


16
@EscobarCeaser, एंड्रॉयड 3.2 के लिए और इसके बाद के संस्करण, आप की जरूरतandroid:configChanges="orientation|screenSize"
Pacerier

9
android:configChanges="orientation|screenSize"मेरे लिये कार्य करता है। धन्यवाद @Pacerier
डॉन लैरींक्स

1
कृपया, अपने उत्तर मामले को अद्यतन करें # 3 android:configChanges="orientation|screenSize"एपीआई के लिए मूल्य के साथ = = 13, क्योंकि बहुत से लोग आपके उत्तर को मुख्य रूप से देखते हैं!
रेडिस्टाओ

215

Xion का उत्तर करीब था, लेकिन # 3 ( android:configChanes="orientation") तब तक काम नहीं करेगा जब तक कि एप्लिकेशन का एपीआई स्तर 12 या उससे कम न हो।

एपीआई स्तर 13 या उससे ऊपर में, अभिविन्यास में परिवर्तन होने पर स्क्रीन का आकार बदल जाता है, इसलिए यह तब भी गतिविधि को नष्ट कर देता है और जब अभिविन्यास बदल जाता है तो शुरू हो जाता है।

बस "स्क्रीनसेज़" विशेषता जोड़ें जैसे मैंने नीचे किया है:

<activity
    android:name=".YourActivityName"
    android:configChanges="orientation|screenSize">
</activity>

अब, जब आप अभिविन्यास बदलते हैं (और स्क्रीन आकार बदलता है), तो गतिविधि अपनी स्थिति बनाए रखती है और onConfigurationChanged()इसे कहा जाता है। यह स्क्रीन पर जो कुछ भी है उसे रखेगा (यानी वेबव्यू में वेबपेज) जब ओरिएंटेशन बदलता है।

इस साइट से इसे सीखा: http://developer.android.com/guide/topics/manifest/activity-element.html

इसके अलावा, यह जाहिरा तौर पर एक बुरा अभ्यास है इसलिए रनटाइम परिवर्तन को संभालने के बारे में नीचे दिए गए लिंक को पढ़ें:

http://developer.android.com/guide/topics/resources/runtime-changes.html


2
धन्यवाद ... "ओरिएंटेशन" के साथ "स्क्रीनसाइज़" के बाद इसका काम।
प्रतीक बुटानी

सैमसंग गैलेक्सी नेक्सस एंड्रॉइड 4.2.1 में काम करता है! android:configChanges="orientation|screenSize"
विंसेंट डुकास्टेल

गजब का। गतिविधि को फिर से लोड करने और शुरुआत से एक वीडियो के साथ मेरे पास एक समस्या को हल करने के लिए कई घंटों तक कोड के माध्यम से काम कर रहे हैं। और यहाँ समाधान था! ++++ 1
मैथियास एशबर्ग

6
बुरा अभ्यास? Pfft, वास्तविक जीवन के लोगों की समय सीमा होती है और अगर यह काम करता है, तो यह काम करता है;)
Kacy

अगर यह एक खराब प्रथा है तो इसे इतना अधिक बढ़ावा क्यों मिला ??
तेज धार

26

आपको बस AndroidManifest.xmlऔर अंदर या अपनी गतिविधियों के लेबल पर जाना होगा, आपको कोड की यह पंक्ति टाइप करनी होगी, जैसा कि किसी ने कहा है:

android:configChanges="orientation|screenSize"

तो, आपके पास कुछ इस तरह होगा:

<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>

मुझे भरोसा है ये काम करेगा!


यह मेरे लेआउट-लैंड लेआउट को लोड नहीं कर रहा है। :( मेरे लिए काम नहीं किया
पीयूष पोरिया

16
<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

android:configChanges="orientation|screenSize"मैनिफ़ेस्ट फ़ाइल की गतिविधि टैब में जोड़ें ।

जब अभिविन्यास बदल जाता है, तो गतिविधि फिर से शुरू नहीं होगी।


यह काम कर रहा है। लेकिन जब मैं प्रत्येक अभिविन्यास लेआउट के लिए अलग लेआउट का उपयोग कर रहा हूं। xml और लेआउट- land.xml। दोनों अभिविन्यास के लिए इसके लैंडस्केप लेआउट को लागू करना। यदि मैं केवल "अभिविन्यास" का उपयोग करता हूं, तो यह वही है जो मैं उम्मीद करता हूं लेकिन फिर से लोड कर रहा हूं। क्या आप इस पर मदद कर सकते हैं?
कार्तिकेयन Ve

1
@KarthikeyanVe यह मुद्दा है जब आप धोखा देने की कोशिश कर रहे हैं। आप करेंगे है परिवर्तन लेआउट के लिए अपनी गतिविधि को पुनः आरंभ करने। आगे बढ़ो और बस वास्तविक समाधान का उपयोग करें, जो उपयोग कर रहा है onSaveInstanceState()और onCreate()
मार्क प्लानो-लेसे

@ MarcPlano-Lesay और मैं ऐसा कैसे कर सकता हूं?
अहसान

@Weaboo वास्तविक समाधान प्रश्न में जुड़ा हुआ है: developer.android.com/guide/topics/resources/…
मार्क प्लानो-लेसे

@ MarcPlano-Lesay मैंने पोर्ट्रेट और लैंडस्केप मोड के लिए अलग लेआउट तैयार किया है, अगर मैं अपने ऐप को लैंडस्केप या पोर्ट्रेट मोड में खोलता हूं तो यह ठीक काम करता है लेकिन जब भी मैं रन टाइम पर ओरिएंटेशन बदलने की कोशिश करता हूं तो यह मेरा ऐप बंद कर देता है, हालांकि जब मैं अपने ऐप में लॉगिन करता हूं और फिर MainActivity पर नेविगेट करें और ओरिएंटेशन को बदलने की कोशिश करें यह उस गतिविधि को फिर से लोड करता है और ठीक काम करता है। अब सवाल यह है कि क्यों? क्या मेरे कोड में कोई तार्किक त्रुटि है? Idk, लेकिन मैंने ऐप को कई बार डिबग करने की कोशिश की है, और मुझे कुछ भी नहीं मिला। इसके अलावा, मैं अपनी गतिविधि को फिर से शुरू नहीं करना चाहता, जब भी कॉन्फ़िगरेशन बदलता है तो हम संबंधित लेआउट को क्यों नहीं अनुकूलित कर सकते?
अहसान

10

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

आपको उस छवि को सहेजना चाहिए जो वर्तमान में प्रदर्शित हो रही है onSaveInstanceState()और इसे ठीक से पुनर्स्थापित करें जब आपका आवेदन onCreate()फिर से चलता है ।


# 3 पूरी तरह से वैध समाधान है। यह इस सटीक समस्या को हल करने के लिए बनाया गया सटीक उपकरण है। आप यह क्यों कहते हैं कि यह जूते का काम है?
पचेरियर

1
@ स्पेसर डॉक्स को बस पढ़ें। "नोट: उपयोग करने android:configChangesसे बचा जाना चाहिए और इसे केवल अंतिम उपाय के रूप में उपयोग किया जाना चाहिए। कृपया कॉन्फ़िगरेशन परिवर्तन के कारण पुनरारंभ को ठीक से कैसे करें, इसके बारे में अधिक जानकारी के लिए रनटाइम परिवर्तन को हैंडल करें।"
मार्क प्लानो-लेसे

क्या आप एक उदाहरण सहेजना और पुनर्स्थापित करना पोस्ट कर सकते हैं।
पोलीरिस

6

यह समाधान अब तक का सबसे अच्छा काम है। अपनी मैनिफ़ेस्ट फ़ाइल में जोड़ें

<activity
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:name="your activity name"
    android:label="@string/app_name" 
    android:screenOrientation="landscape">
  </activity

और अपनी गतिविधि कक्षा में निम्न कोड जोड़ें

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //your code
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  //your code

    }
}


3

बस इसे अपने में जोड़ें AndroidManifest.xml

<activity android:screenOrientation="landscape">

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


मैं स्क्रीन को घुमाने की क्षमता को दूर नहीं देखना चाहता। मैं बस अपने app पुनः लोड नहीं करना चाहता ... जैसा कि मैंने उल्लेख किया है।
जिमी डी

ps ... यह वैसे भी काम नहीं करता है। यह सिर्फ ऐप को एक निश्चित अभिविन्यास में प्रदर्शित करने के लिए मजबूर करता है। स्क्रीन को घुमाने पर अभी भी गतिविधि फिर से लोड होती है
जिमी डी

3

मैनिफ़ेस्ट फ़ाइल में प्रत्येक गतिविधि में यह जोड़ें। ये सहायता करेगा

android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"

ScreenLayout ने मेरे लिए काम किया, एंड्रॉइड पर स्प्लिटस्क्रीन के लिए ऐप का आकार बदलने पर रिफ्रेश होने से रोका
Terren

2

उपरोक्त सभी उत्तर मेरे लिए काम नहीं कर रहे हैं। तो, मैंने नीचे की तरह के labelसाथ उल्लेख करके तय किया है screenOrientation। अब सब ठीक है

<activity android:name=".activity.VideoWebViewActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize"/>


1

अपने विवरण में छवि विवरण सहेजें onPause()या छवि को पुनर्स्थापित करने onStop()के onCreate(Bundle savedInstanceState)लिए इसका उपयोग करें।

संपादित करें:

वास्तविक प्रक्रिया के बारे में अधिक जानकारी यहाँ विस्तृत है http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle, क्योंकि यह पिछले Android संस्करणों की तुलना में हनीकॉम्ब में भिन्न है।


वास्तव में आप इसे onSaveInstanceState () विधि
Willi Mentzel



-1

मैं नहीं जानता कि क्या एक सबसे अच्छा समाधान है, लेकिन मैं इसे यहाँ वर्णन:

सबसे पहले, आपको आपके साथ प्रमाणपत्र की आवश्यकता है, आपके एप्लिकेशन का वर्ग इस के अपने प्रकटन में है:

<application
    android:name=".App"
    ...

दूसरा, मेरी कक्षा ऐप में मैंने ऐसा किया:

public class App extends Application {
    public static boolean isOrientationChanged = false;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onConfigurationChanged(@NotNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
                newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            isOrientationChanged = true;
        }
    }

}

तीसरा, आपको ओरिएंटेशन चेंज करने के लिए एक ध्वज सेट करने की आवश्यकता है, मेरे मामले में, मैं हमेशा इसे तब सेट करता हूं जब ऐप नेविगेशन के भीतर की पिछली गतिविधि को कहा जाता है, इसलिए केवल एक बार कॉल करना जब बाद की गतिविधि बनाई जाती है।

isOrientationChanged = false;

इसलिए हर बार जब मैं उस संदर्भ में अपनी स्क्रीन का ओरिएंटेशन बदलता हूं, तो मैं इसे सेट करने के बाद हर बार इसे सेट करता हूं, यह जांचता है कि क्या ओरिएंटेशन में कोई बदलाव हुआ है, यदि हां, तो यह उस ध्वज के मूल्य के आधार पर इसे मान्य करता है।

असल में, जब भी मैंने एक अतुल्यकालिक रेट्रोफिट अनुरोध किया, मुझे उसका उपयोग करना पड़ा, जिसे उसने हर पल कहा कि अभिविन्यास बदल गया, लगातार एप्लिकेशन क्रैश हो रहा है:

if (!isOrientationChanged) {
    presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}

मुझे नहीं पता कि यह सबसे सुंदर और सुंदर समाधान है, लेकिन कम से कम यहां यह कार्यात्मक है :)


-2

इस कोड onCreateको अपनी गतिविधि में विधि के बाद जोड़ेंWebView

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}

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