दिलचस्प पोस्ट
वर्तमान JSON सरणी (जैसे ) को प्रकार में नहीं हटा सकते जावास्क्रिप्ट नामकरण सम्मेलनों गणित अभिव्यक्तियों को सरल बनाने के लिए रणनीतियां पुनरावर्ती सरणियों के लिए क्या अच्छा है? EXE से MSI निकालें फ़ंक्शन पॉइंटर्स का क्या मतलब है? मैं SQL सर्वर में एक VARCHAR स्तंभ को कैसे सॉर्ट कर सकता हूँ जिसमें संख्याएं हैं? लिंक्ड सर्वर नल के लिए OLE DB प्रदाता Microsoft.Jet.OLEDB.4.0 का उदाहरण नहीं बना सकता ऑफ़लाइन स्थापना के लिए ईक्लिप्स प्लग-इन अपडेट साइट डाउनलोड करना "कोड साइनिंग" त्रुटि के साथ Xcode विफल रहता है लॉन्चर में घातक त्रुटि: "\ Program Files (x86) \ Python33 \ python.exe" "C: \ Program Files (x86) \ Python33 \ pip.exe" "" का उपयोग करके प्रक्रिया बनाने में असमर्थ: कस्टम जावाएफएक्स वेबविउ प्रोटोकॉल हैंडलर डेल्फी आवेदन के लिए प्लगइन्स सिस्टम – बीपीएल बनाम डीएलएल? android.dexOptions.incremental संपत्ति नापसंद है उपयोगकर्ता द्वारा अंतिम तस्वीर ले लीजिए

स्क्रीन अभिविन्यास परिवर्तनों पर राज्य को खोने से कस्टम दृश्यों को कैसे रोकें

मैंने अपने मुख्य Activity लिए स्क्रीन ओरिएंटेशन परिवर्तनों में कुछ महत्वपूर्ण घटकों को सहेजने और पुनर्स्थापित करने के लिए onRetainNonConfigurationInstance() सफलतापूर्वक कार्यान्वित किया है।

लेकिन ऐसा लगता है, मेरे कस्टम विचारों को खरोंच से फिर से बनाया जा रहा है जब ओरिएंटेशन परिवर्तन होता है। यह समझ में आता है, हालांकि मेरे मामले में यह असुविधाजनक है क्योंकि प्रश्न में कस्टम दृश्य एक्स / वाई प्लॉट है और प्लॉट किए गए बिंदु कस्टम दृश्य में संग्रहीत हैं।

क्या कस्टम दृश्य के लिए onRetainNonConfigurationInstance() समान कुछ लागू करने का एक चालाक तरीका है, या मुझे कस्टम दृश्य में तरीकों को लागू करने की आवश्यकता है जो मुझे "राज्य" प्राप्त करने और सेट करने की अनुमति देती है?

Solutions Collecting From Web of "स्क्रीन अभिविन्यास परिवर्तनों पर राज्य को खोने से कस्टम दृश्यों को कैसे रोकें"

आप यह View#onSaveInstanceState को कार्यान्वित View#onSaveInstanceState और View#onRestoreInstanceState और View.BaseSavedState वर्ग को विस्तारित करते View.BaseSavedState

 public class CustomView extends View { private int stateToSave; ... @Override public Parcelable onSaveInstanceState() { //begin boilerplate code that allows parent classes to save state Parcelable superState = super.onSaveInstanceState(); SavedState ss = new SavedState(superState); //end ss.stateToSave = this.stateToSave; return ss; } @Override public void onRestoreInstanceState(Parcelable state) { //begin boilerplate code so parent classes can restore state if(!(state instanceof SavedState)) { super.onRestoreInstanceState(state); return; } SavedState ss = (SavedState)state; super.onRestoreInstanceState(ss.getSuperState()); //end this.stateToSave = ss.stateToSave; } static class SavedState extends BaseSavedState { int stateToSave; SavedState(Parcelable superState) { super(superState); } private SavedState(Parcel in) { super(in); this.stateToSave = in.readInt(); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(this.stateToSave); } //required field that makes Parcelables from a Parcel public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; } } 

कार्य व्यू और व्यू के सहेजेस्टस्टेट क्लास के बीच विभाजित है। आपको SavedState कक्षा में Parcel को पढ़ने और लिखने के लिए काम करना चाहिए। तब आपका व्यू क्लास राज्य के सदस्यों को निकालने और कक्षा वापस एक मान्य राज्य के लिए आवश्यक काम करने के काम कर सकता है।

नोट्स View#onSavedInstanceState और View#onRestoreInstanceState को आपके लिए स्वचालित रूप से कहा जाता है अगर View#getId एक मूल्य> = 0. देता है। यह तब होता है जब आप इसे xml में आईडी या मैन्युअल रूप से setId कॉल setId अन्यथा आपको View#onSaveInstanceState को कॉल करना होगा और पार्सल योग्य पार्सल को वापस लेना होगा जो आप को Activity#onSaveInstanceState को राज्य को बचाने के लिए और बाद में इसे पढ़कर इसे पास करें और View#onRestoreInstanceState को Activity#onRestoreInstanceState से View#onRestoreInstanceState

इस का एक और सरल उदाहरण CompoundButton

मुझे लगता है कि यह एक बहुत सरल संस्करण है। Bundle एक अंतर्निहित प्रकार है जो Parcelable लागू Parcelable

 public class CustomView extends View { private int stuff; // stuff @Override public Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); bundle.putParcelable("superState", super.onSaveInstanceState()); bundle.putInt("stuff", this.stuff); // ... save stuff return bundle; } @Override public void onRestoreInstanceState(Parcelable state) { if (state instanceof Bundle) // implicit null check { Bundle bundle = (Bundle) state; this.stuff = bundle.getInt("stuff"); // ... load stuff state = bundle.getParcelable("superState"); } super.onRestoreInstanceState(state); } } 

यहां एक और संस्करण है जो दो तरीकों के मिश्रण का उपयोग करता है I एक Bundle की सादगी के साथ Parcelable की गति और शुद्धता का मेल करना:

 @Override public Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); // The vars you want to save - in this instance a string and a boolean String someString = "something"; boolean someBoolean = true; State state = new State(super.onSaveInstanceState(), someString, someBoolean); bundle.putParcelable(State.STATE, state); return bundle; } @Override public void onRestoreInstanceState(Parcelable state) { if (state instanceof Bundle) { Bundle bundle = (Bundle) state; State customViewState = (State) bundle.getParcelable(State.STATE); // The vars you saved - do whatever you want with them String someString = customViewState.getText(); boolean someBoolean = customViewState.isSomethingShowing()); super.onRestoreInstanceState(customViewState.getSuperState()); return; } // Stops a bug with the wrong state being passed to the super super.onRestoreInstanceState(BaseSavedState.EMPTY_STATE); } protected static class State extends BaseSavedState { protected static final String STATE = "YourCustomView.STATE"; private final String someText; private final boolean somethingShowing; public State(Parcelable superState, String someText, boolean somethingShowing) { super(superState); this.someText = someText; this.somethingShowing = somethingShowing; } public String getText(){ return this.someText; } public boolean isSomethingShowing(){ return this.somethingShowing; } } 

यहां दिए गए उत्तर बहुत अच्छे हैं, लेकिन कस्टम देखें समूह के लिए जरूरी काम नहीं करते हैं। अपने राज्य को बनाए रखने के लिए सभी कस्टम दृश्य प्राप्त करने के लिए, आपको प्रत्येक कक्षा में onSaveInstanceState() और onRestoreInstanceState(Parcelable state) ओवरराइड करना होगा। आपको यह भी सुनिश्चित करना होगा कि वे सभी अद्वितीय आईडी हैं, चाहे वे एक्सएमएल से फुलाए गए हों या प्रोग्रामेटिक रूप से जोड़ा जाए

मैं किसके साथ आया था Kobor42 के उत्तर की तरह उल्लेखनीय था, लेकिन त्रुटि बने रही क्योंकि मैं कस्टम व्यू ग्रुप को दर्शाने के लिए प्रोग्रामेटिक रूप से जोड़ रहा था और अद्वितीय आईडी नहीं बता रहा था।

मैटो द्वारा साझा लिंक काम करेगा, लेकिन इसका मतलब है कि व्यक्तिगत दृश्यों में से कोई भी अपना खुद का प्रबंधन न करे – पूरे राज्य को ViewGroup विधियों में सहेजा गया है।

समस्या यह है कि जब इन ViewGroups के एकाधिक लेआउट में जोड़ दिए जाते हैं, तो xml से उनके तत्वों की आईडी अब अद्वितीय नहीं हैं (यदि यह एक्सएमएल में परिभाषित है)। रनटाइम पर, आप एक व्यू के लिए एक अद्वितीय आईडी प्राप्त करने के लिए स्थिर विधि View.generateViewId() कॉल कर सकते हैं। यह केवल एपीआई 17 से उपलब्ध है

ViewGroup (यह सार है, और mriginalValue एक प्रकार चर है) से मेरा कोड है:

 public abstract class DetailRow<E> extends LinearLayout { private static final String SUPER_INSTANCE_STATE = "saved_instance_state_parcelable"; private static final String STATE_VIEW_IDS = "state_view_ids"; private static final String STATE_ORIGINAL_VALUE = "state_original_value"; private E mOriginalValue; private int[] mViewIds; // ... @Override protected Parcelable onSaveInstanceState() { // Create a bundle to put super parcelable in Bundle bundle = new Bundle(); bundle.putParcelable(SUPER_INSTANCE_STATE, super.onSaveInstanceState()); // Use abstract method to put mOriginalValue in the bundle; putValueInTheBundle(mOriginalValue, bundle, STATE_ORIGINAL_VALUE); // Store mViewIds in the bundle - initialize if necessary. if (mViewIds == null) { // We need as many ids as child views mViewIds = new int[getChildCount()]; for (int i = 0; i < mViewIds.length; i++) { // generate a unique id for each view mViewIds[i] = View.generateViewId(); // assign the id to the view at the same index getChildAt(i).setId(mViewIds[i]); } } bundle.putIntArray(STATE_VIEW_IDS, mViewIds); // return the bundle return bundle; } @Override protected void onRestoreInstanceState(Parcelable state) { // We know state is a Bundle: Bundle bundle = (Bundle) state; // Get mViewIds out of the bundle mViewIds = bundle.getIntArray(STATE_VIEW_IDS); // For each id, assign to the view of same index if (mViewIds != null) { for (int i = 0; i < mViewIds.length; i++) { getChildAt(i).setId(mViewIds[i]); } } // Get mOriginalValue out of the bundle mOriginalValue = getValueBackOutOfTheBundle(bundle, STATE_ORIGINAL_VALUE); // get super parcelable back out of the bundle and pass it to // super.onRestoreInstanceState(Parcelable) state = bundle.getParcelable(SUPER_INSTANCE_STATE); super.onRestoreInstanceState(state); } }