2015-02-18 8 views
13

नहीं कहा गया है, मैं कस्टम व्यू के साथ काम कर रहा हूं जो कुछ एंड्रॉइड व्यू को फ्रेमलेआउट जैसे विस्तारित करता है। मेरे लेआउट में मैं एक कस्टम पेजर एडाप्टर के साथ एक ViewPager का उपयोग करता हूं।एंड्रॉइड व्यू ऑनसेवस्टेंसस्टेट को

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

मुझे पता है कि एक पेजर एडाप्टर के साथ, सभी टुकड़े एक ही समय में सक्रिय नहीं हैं, मूल रूप से + 1/-1 बस।

मुझे नहीं पता कि मेरा View.onSaveInstanceState() क्यों नहीं कहा जाता है, ताकि RestoreInstanceState पर।

उत्तर

22

आसान जवाब: क्योंकि मैं मेरे विचार (कस्टम या नहीं) के लिए आईडी की स्थापना नहीं किया गया है। अगर कोई आईडी दृश्य में सेट नहीं है तो एंड्रॉइड onSaveInstanceState/onRestoreInstanceState का प्रबंधन नहीं करता था।

इसलिए मेरा कस्टम व्यू बेस व्यू को विस्तारित कर रहा था, अतिरिक्त संपत्ति के साथ, दृश्य को आईडी सेट करने से समस्या हल हो गई और इसलिए SaveInstanceState/onRestoreInstanceState को इसे चाहिए जैसा कि कहा जाना चाहिए।

तो सारांश के लिए, इस दृष्टिकोण का उपयोग करें:

एक्सएमएल से

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    ... 
    android:id="@+id/scrollView"> 
</ScrollView> 

या जावा से

yourCustomView.setId(R.id.myCustomView); 

पिछले मामले, आप स्थिर आईडी के लिए जोड़ रहा है res/values ​​/ ids.xml <item name="myCustomView" type="id"/>

+1

मेरे लिए यह परिदृश्य परिवर्तन पर काम नहीं कर रहा है, जो परिदृश्य और चित्र के लिए विभिन्न लेआउट के साथ है। ऑनसेव इंस्टेंसस्टेट को कॉल किया जाता है, लेकिन ऑनस्टोर इंस्टेंसस्टेट – Boy

+0

@ बॉय मुझे एक ही समस्या नहीं है। क्या एक दृश्य के भीतर आपका दृश्य है जिसे व्यूअर पर होस्ट किया गया है? –

+0

@AndreaBaccega वास्तव में यह मामला है। ऐसा लगता है कि ViewPager कुछ – Boy

3

डिफ़ॉल्ट से बचत राज्य

अब हमारे पास अपने राज्य को बचाने और पुनर्स्थापित करने के लिए हमारे दृष्टिकोण के लिए सब कुछ है। हालांकि, यह डिफ़ॉल्ट रूप से नहीं होगा। यह आप पर निर्भर है करने के लिए

setSaveEnabled(true); 

होना या न होना: यदि आप अपने दृश्य के उदाहरण राज्य स्वचालित रूप से सहेजना चाहते हैं, तो आप init विधि में यह पंक्ति जोड़ सकते हैं। यहां तक ​​कि यदि आपका दृश्य डिफ़ॉल्ट रूप से राज्य को सहेजता नहीं है, तो दृश्य के उपयोगकर्ता हमेशा सेटसेवएनेबल (सत्य) को कॉल करके बचत मोड को सक्षम कर सकते हैं, या लेआउट xml में saveEnabled = "true" निर्दिष्ट करके।

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