मुझे एसओ पर एक समान प्रश्न के कई उदाहरण मिले हैं लेकिन कोई भी जवाब दुर्भाग्य से मेरी आवश्यकताओं को पूरा नहीं करता है।
मेरे पास चित्र और परिदृश्य के लिए अलग-अलग लेआउट हैं और मैं बैक स्टैक का उपयोग कर रहा हूं, जो दोनों मुझे setRetainState()
कॉन्फ़िगरेशन परिवर्तन दिनचर्या का उपयोग करने और ट्रिक्स से बचाता है ।
मैं उपयोगकर्ता को TextViews में कुछ जानकारी दिखाता हूं, जो डिफ़ॉल्ट हैंडलर में सहेजे नहीं जाते हैं। पूरी तरह से गतिविधियों का उपयोग करते हुए मेरे आवेदन को लिखते समय, निम्नलिखित ने अच्छी तरह से काम किया:
TextView vstup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever);
vstup = (TextView)findViewById(R.id.whatever);
/* (...) */
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putCharSequence(App.VSTUP, vstup.getText());
}
@Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
vstup.setText(state.getCharSequence(App.VSTUP));
}
Fragment
एस के साथ , यह केवल बहुत विशिष्ट स्थितियों में काम करता है। विशेष रूप से, जो कुछ टूटता है वह एक टुकड़े को बदल रहा है, इसे पीछे के ढेर में डाल दिया जाता है और फिर स्क्रीन को घुमाते हुए नया टुकड़ा दिखाया जाता है। जो मैंने समझा था, पुराने टुकड़े को onSaveInstanceState()
प्रतिस्थापित होने पर कॉल नहीं मिलता है लेकिन किसी तरह से जुड़ा रहता है Activity
और इस पद्धति को बाद में कहा जाता है जब इसका View
कोई अस्तित्व नहीं होता है, इसलिए मेरे किसी भी TextView
परिणाम की तलाश में NullPointerException
।
इसके अलावा, मैंने पाया कि मेरे लिए संदर्भ रखना s के TextViews
साथ अच्छा विचार नहीं है Fragment
, भले ही वह Activity
's' के साथ ठीक हो । उस स्थिति में, onSaveInstanceState()
वास्तव में राज्य को बचाता है, लेकिन टुकड़ा फिर से दिखाई देने पर स्क्रीन को दो बार घुमाए जाने पर समस्या फिर से प्रकट होती है, क्योंकि इसके onCreateView()
नए उदाहरण में कॉल नहीं मिलता है।
मैं में राज्य को बचाने के बारे में सोचा onDestroyView()
कुछ में Bundle
प्रकार वर्ग के सदस्य तत्व (यह वास्तव में और अधिक डेटा, न सिर्फ एक है TextView
और बचत) कि में onSaveInstanceState()
लेकिन कुछ अन्य कमियां हैं। जाहिर है, अगर टुकड़ा है वर्तमान में दिखाया गया है, दो कार्यों बुला के आदेश को पलट तो मैं दो अलग-अलग परिस्थितियों के लिए खाते में आवश्यकता होगी है। एक क्लीनर और सही समाधान होना चाहिए!