2011-05-18 9 views
28

मुझे गतिविधि स्थिति की बचत और पुनर्स्थापना के बारे में पता है। लेकिन मैं जो करना चाहता हूं वह एक दृश्य की स्थिति को सहेजना और बहाल करना है। मैं इसमें एक कस्टम दृश्य और दो overrided तरीकों:दृश्य स्थिति एंड्रॉइड को सहेजना और बहाल करना

@Override 
protected void onRestoreInstanceState(Parcelable state) { 
    if (state instanceof Bundle) { 
     Bundle bundle = (Bundle) state; 
     currentLeftX = bundle.getInt(CURRENT_LEFT_X_PARAM, 0); 
     currentTopY = bundle.getInt(CURRENT_TOP_Y_PARAM, 0); 
    } 
    super.onRestoreInstanceState(state); 
} 

@Override 
protected Parcelable onSaveInstanceState() { 
    super.onSaveInstanceState(); 
    Bundle bundle = new Bundle(); 
    bundle.putInt(CURRENT_LEFT_X_PARAM, currentLeftX); 
    bundle.putInt(CURRENT_TOP_Y_PARAM, currentTopY); 
    return bundle; 
} 

मैं इस सहज काम करने की उम्मीद है, लेकिन का सामना करना पड़ा और त्रुटि:

Caused by: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.os.Bundle instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/mapViewId. Make sure other views do not use the same id. at android.view.View.onRestoreInstanceState(View.java:6161)

लेकिन इस दृश्य मेरी गतिविधियों में से एक है। तो, मैं पूछ रहा हूं:

दृश्य की स्थिति को सहेजने का सही तरीका क्या है?

+0

मैं की वजह से कैसे हास्यास्पद एंड्रॉयड के डिजाइन है हंसी करना पड़ा। विधि राज्य की अपेक्षा नहीं करता *** स्पष्ट रूप से ***, यह *** स्पष्ट रूप से *** *** पार्ससेल *** नामक एक इंटरफ़ेस की अपेक्षा करता है। और हाँ हम एक वैध *** पार्ससेल *** वापस कर देते हैं जो *** बंडल *** द्वारा कार्यान्वित किया जाता है। लेकिन यह एक हास्यास्पद कारण के लिए विफल रहा। मैंने .NET में इस तरह के डिज़ाइन का कभी सामना नहीं किया है, जब यह एक इंटरफ़ेस की अपेक्षा करता है, तो अगर हम उस सटीक इंटरफ़ेस को वापस करते हैं तो कोई अपवाद नहीं होना चाहिए। अपवाद को कुछ और समझने के लिए कुछ और कहना चाहिए =))) एंड्रॉइड एक बड़ा उदाहरण है कि *** खराब *** डिज़ाइन आपको परेशान कर सकता है। –

उत्तर

-3

मैं गलत हो सकता है, लेकिन मैं आपको बंडल माता पिता रिटर्न बचाने की जरूरत है लगता है:

@Override 
protected Parcelable onSaveInstanceState() { 
    Parcelable bundle = super.onSaveInstanceState(); 
    bundle.putInt(CURRENT_LEFT_X_PARAM, currentLeftX); 
    bundle.putInt(CURRENT_TOP_Y_PARAM, currentTopY); 
    return bundle; 
} 

अन्यथा आप खो रहे हैं superclass बचाया सब कुछ।

+4

onSaveInstanceState का डिफ़ॉल्ट कार्यान्वयन शून्य देता है। इसके अलावा, यहां बंडल पार्सेलबल है, जिसमें putInt जैसी कोई विधि नहीं है। –

2

आप super.OnSaveInstanceState() का परिणाम छोड़ दें और अपना खुद का लौटें। बाद में OnRestoreInstanceState(Parcelable) पर आप जो भी बनाया है उसे वापस कर दें।

उस के लिए यहाँ समाधान है:

How to prevent custom views from losing state across screen orientation changes #2

+1

आप परिणाम नहीं छोड़ते हैं - आपके पूर्वजों ने राज्य को बचाया हो सकता है, और फिर आप गलत क्रम में प्रविष्टियों को पढ़ लेंगे – ataulm