6

पर रीसेट किया जा रहा है मेरे पास एक संपादन टेक्स्ट और एक छविदृश्य और एक बटन के साथ एक छोटी गतिविधि है। जब आप बटन दबाते हैं तो यह परिणाम के लिए कैमरा लॉन्च करता है, और जब यह लौटाता है तो यह आपके द्वारा ली गई तस्वीर पर छविदृश्य बदल देता है।मेरे विचार अभिविन्यास परिवर्तन

लेकिन जब अभिविन्यास बदलता है, तो छविदृश्य लेआउट पर डिफ़ॉल्ट पर वापस रीसेट हो जाता है।

मैंने जो करने की कोशिश की वह कस्टम नामक बुलियन स्थापित कर रहा था, और जब आप एक तस्वीर लेते हैं तो यह इसे सत्य पर सेट करता है। मैं ऑनफ्रिगेंसी चेंज किया गया() और अगर कस्टम सत्य पर सेट है तो मैं छवि को पुनर्स्थापित करता हूं।

मेरी समस्या अब EditText मिटा दी गई है - कॉन्फ़िगरेशन परिवर्तन के बाद मैं EditText को कैसे पुनर्स्थापित कर सकता हूं? मेरा पहला प्रयास इसकी सामग्री को स्ट्रिंग ऑन पॉज़() में संग्रहीत कर रहा था और फिर इसे बहाल कर रहा था, लेकिन यह हमेशा खाली हो जाता है।

उत्तर

14

आमतौर पर जब यूआई व्यू अपनी स्थिति नहीं रखता है, तो जांच करने वाली पहली बात यह है कि इस यूआई व्यू में आईडी असाइन की गई है। इस आईडी के विचारों के बिना अपने राज्य को बहाल नहीं कर सकते हैं।

<EditText android:id="@+id/text" ... /> 

यदि यह मदद नहीं करता है, आप अपने आप को बचाने के लिए और राज्य को बहाल करने की जरूरत है। Handling Runtime Changes पर एक नज़र डालें। यह बहुत ज्यादा बताते हैं आपको क्या करना चाहिए:

ठीक से पुन: प्रारंभ करने संभाल करने के लिए, यह महत्वपूर्ण है कि आपकी गतिविधि सामान्य गतिविधि जीवन चक्र, जिसमें एंड्रॉयड कॉल onSaveInstanceState() के माध्यम से अपनी पूर्व स्थिति पुनर्स्थापित करता है इससे पहले कि यह इतना है कि अपनी गतिविधि को नष्ट कर देता आप आवेदन स्थिति के बारे में डेटा बचा सकते हैं। फिर आप onCreate() या onRestoreInstanceState() के दौरान राज्य को पुनर्स्थापित कर सकते हैं। यह जांचने के लिए कि आपका एप्लिकेशन एप्लिकेशन स्थिति के साथ अपने आप को पुनरारंभ करता है, आपको अपने आवेदन में विभिन्न कार्यों को निष्पादित करते समय कॉन्फ़िगरेशन परिवर्तन (जैसे स्क्रीन अभिविन्यास बदलना) का आह्वान करना चाहिए।

आप onSaveInstanceState() ओवरराइड करना चाहिए और अपने acitivity राज्य को बचाने जब इसकी बुलाया:

@Override 
protected void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putString("textKey", mEditText.getText().toString()); 
} 

और फिर onCreate() या onRestoreInstanceState() में राज्य को बहाल:

public void onCreate(Bundle savedInstanceState) 
{ 
    if(savedInstanceState != null) 
    { 
     mEditText.setText(savedInstanceState.getString("textKey")); 
    } 
} 

यह अभी भी नहीं है, तो पर्याप्त, आप onRetainNonConfigurationInstance() ओवरराइड कर सकते हैं और किसी भी कस्टम ऑब्जेक्ट को वापस कर सकते हैं जो pa होगा जब इसे फिर से बनाया गया, तो नई गतिविधि वस्तु के लिए ssed। इसका उपयोग कैसे करें इसके बारे में अधिक जानकारी Handling Runtime Changes में पाई जा सकती है। लेकिन यह फ़ंक्शन एंड्रॉइड 3.0+ में बहिष्कृत है (विशेष रूप से FragmentActivity जहां इसके अंतिम)। तो इसका उपयोग टुकड़ों के साथ एक साथ नहीं किया जा सकता है (जो ठीक है, उनके पास कॉन्फ़िगरेशन परिवर्तनों में ऑब्जेक्ट्स को बनाए रखने के लिए उनकी तंत्र है)।


और अंतिम एक - कभी भी android:configChanges का उपयोग न करें। इसका उपयोग करने के आपके पास बहुत अच्छे कारण होने चाहिए, और आमतौर पर ये प्रदर्शन कारण हैं। यह अब जिस तरह से दुर्व्यवहार किया गया था इसका मतलब नहीं था: बस यूआई राज्य रीसेट को रोकने के लिए। यदि यह विशेषता उपयोग की जाती है, तो हाँ, गतिविधि UI कॉन्फ़िगरेशन परिवर्तन पर फिर से सेट नहीं किया जाएगा, लेकिन बाद में नष्ट होने और पुन: निर्मित होने पर गतिविधि स्थिति को रीसेट कर दिया जाएगा।

प्रलेखन बहुत अच्छी तरह से इस विकल्प को बताते हैं:

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

+0

ठीक है तो यह एक बेहतर दृष्टिकोण की तरह लगता है। मैं इसके बजाय बिटमैप के लिए इसका उपयोग कर सकता हूं, और फिर edittext कोई समस्या नहीं होगी - लेकिन मैं छवि के राज्य को सहेजने के लिए किस फ़ंक्शन का उपयोग करूंगा? – Sebastian

+0

यदि बिटमैप डिस्क पर सहेजा गया है, तो बस 'onSaveInstanceState()' फ़ंक्शन में बिटमैप के पथ को सहेजें। अगर बिटमैप मेमोरी में है, तो आप 'onRetainNonConfigurationInstance() 'का उपयोग कर सकते हैं। – inazaruk

4

मैनिफेस्ट में अपनी गतिविधि पंक्ति में android:configChanges="orientation" जोड़कर अभिविन्यास बदलने के बाद आप अपनी गतिविधि को फिर से लोड नहीं कर सकते हैं।

+0

लिए अनुशंसित नहीं है लेकिन उस गतिविधि फोन बग़ल में किया जा रहा करने के लिए समायोजित नहीं कर नहीं होगा? – Sebastian

+0

यह सही उत्तर है। जो स्क्रीन को अभिविन्यास बदलने के लिए रोकता है वह है 'एंड्रॉइड: स्क्रीनऑरिएंटेशन = "पोर्ट्रेट" ' –

+4

हालांकि यह इस विशेष मामले को हल करता है, यह अंतर्निहित समस्या को ठीक नहीं करता है। और 'android: configChanges' को अंतिम उपाय माना जाता है, और आमतौर पर इसका उपयोग कभी नहीं किया जाना चाहिए। http://developer.android.com/guide/topics/resources/runtime-changes.html – inazaruk

संबंधित मुद्दे