2012-02-23 16 views
13

मेरे पास एक टुकड़ा है जिसमें इसका अपना राज्य है (चयनित बटन, आदि)। वह स्क्रीन स्क्रीन रोटेशन पर खो जाती है।SaveInstanceState() पर मेरे टुकड़े क्यों नहीं बुलाए जा रहे हैं?

गतिविधि जिसमें खंड शामिल है/में/res/layout/में एक पोर्ट्रेट लेआउट है, और/res/layout/land/में लगभग समान लैंडस्केप लेआउट है। दोनों लेआउट तो जैसे टुकड़ा में शामिल हैं:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <fragment 
     android:id="@+id/testFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     class="au.com.x.y.TestFragment" /> 
...</LinearLayout> 

टुकड़ा वर्ग मैं के साथ परीक्षण किया गया है:

public class TestFragment extends android.support.v4.app.Fragment { 
    private static final String TAG = "TestFragment"; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.i(TAG, "onCreate(): " + 
       (savedInstanceState != null ? "NOT NULL" : "NULL")); 
    } 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Log.i(TAG, "onActivityCreated(): " + 
       (savedInstanceState != null ? "NOT NULL" : "NULL")); 
    } 
    public void onSaveInstanceState(Bundle state) { 
     super.onSaveInstanceState(state); 
     Log.i(TAG, "onSaveInstanceState()"); 
     state.putString("saved_thing", "some_value"); 
    } 
    public View onCreateView(
     LayoutInflater inflater, 
     ViewGroup container, 
     Bundle b) { ... } 
} 

ध्यान दें कि मैं टुकड़े के लिए पूर्व -3.0 सहायता पैकेज का उपयोग कर रहा, में लाया ActionBarSherlock के माध्यम से।

LogCat मुझे देता है:

BEFORE SCREEN ROTATION (PORTRAIT): 
02-23 11:45:58.015: I/TestFragment(22629): onCreate(): NULL 
02-23 11:45:58.015: I/TestFragment(22629): onCreateView() 
02-23 11:45:58.035: I/TestFragment(22629): onActivityCreated(): NULL 
AFTER SCREEN ROTATION (LANDSCAPE): 
02-23 11:46:00.615: I/TestFragment(22629): onCreate(): NULL 
02-23 11:46:00.615: I/TestFragment(22629): onCreateView() 
02-23 11:46:00.635: I/TestFragment(22629): onActivityCreated(): NULL 

आप देख सकते हैं, onSaveInstanceState() कभी नहीं कहा जाता है, और टुकड़ा हमेशा एक अशक्त savedInstanceState हो जाता है, onCreate() और onActivityCreated() दोनों में।

मैंने मेरी गतिविधियों में onCreate() की कोशिश की है, लेकिन इसमें कुछ भी नहीं बदला है।

मेरा onSaveInstanceState() में @ ओवरराइड है, इसलिए मुझे पता है कि यह टाइपो की तरह बेवकूफ नहीं है।

मैंने एक्शनबैरशेलॉक उदाहरणों में से एक को देखा है (com.actionbarsherlock.sample.shakespeare) और उनके onSaveInstanceState() विधियों को ठीक से बुलाए गए टुकड़े हैं। जहां तक ​​मैं कह सकता हूं, वह उदाहरण बिल्कुल लिखा गया है कि मेरा कोड — टुकड़े दोनों लेआउट और लेआउट-भूमि एक्सएमएल के माध्यम से शामिल हैं। मैंने एक्शनबैरशेलॉक के बिल्कुल उसी संस्करण का उपयोग करके उस नमूने को भी बनाया है क्योंकि मेरा मुख्य प्रोजेक्ट उपयोग कर रहा है, और उदाहरण के लिए उदाहरण स्थिति ठीक काम करता है।

मैं स्क्रीन रोटेशन में अपने टुकड़े की स्थिति कैसे बनाए रखूं? onSaveInstanceState() क्यों नहीं कहा जा रहा है?

+0

कोशिश करें और @ ओवरराइड 'पर रोकें()'/'ऑनर्यूम()'। –

+1

रोटेशन पर बुलाया गया आदेश ऑनपॉज़(), ऑनस्ट्रोय(), ऑनक्रेट(), ऑनक्रेटिव्यू() पर, एक्टिविटीक्रेटेड(), ऑनस्यूम() पर है। SaveInstanceState अभी भी हमेशा शून्य है, और SaveInstanceState() पर कभी नहीं कहा जाता है। मुझे पूरा यकीन है कि मुझे कहीं भी SaveInstanceState() पर स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है? – George

+0

क्या समस्या दो अलग-अलग स्थानों (पोर्ट्रेट लेआउट बनाम लैंडस्केप लेआउट) में संदर्भित खंड के साथ कुछ करने के लिए है? शायद यह एंड्रॉइड को संकेत दे रहा है कि ये दो अलग-अलग टुकड़े हैं जिन्हें राज्य साझा नहीं करना चाहिए? – George

उत्तर

23

आप राज्य बनाए रखने के लिए myFragment.setRetainInstance(true) सक्षम कर सकते हैं, लेकिन यह इस 'स्वतः ही' है, यानी यह अपने वर्ग सदस्यों को सौंपा मूल्यों को बरकरार रखे हुए है और onSaveInstanceState उपयोग नहीं करता है (और इसलिए savedInstanceState हमेशा रिक्त है) करता है।

सुनिश्चित करें कि FragmentActivity जो इस खंड को होस्ट करता है onSaveInstanceState ओवरराइड नहीं करता है या जब इसे super.onSaveInstanceState(Bundle) पर कॉल करना चाहिए।

+4

Arg, इतना आसान! मैं अपनी गतिविधि में 'super.onSaveInstanceState()' नहीं बुला रहा था। जवाब एरिक के लिए धन्यवाद ढेर, मैं अपने बालों को फाड़ रहा था ... – George

0

घुमाए जाने पर खंड को एक अलग लेआउट संसाधन की आवश्यकता होती है, setRetainInstance(true) का उपयोग नहीं किया जा सकता है। यह pagesetRetainInstance(true) के साथ खंड का जीवन चक्र दिखाता है।

मूल विचार सभी सदस्यों के डेटा को बनाए रखने के लिए onSaveInstanceState() का उपयोग करता है, जैसे कि नियमित गतिविधि। हालांकि, किसी कारण से, onSaveInstanceState() नहीं कहा जाता है। लेकिन FragmentActivity सही है, क्योंकि @Eric Kok ने सुझाव दिया)। मुझे मिला सबसे अच्छा समाधान तर्क का उपयोग करना है।

solutionFyodor Volchyok द्वारा देखें, यह आसान है। ऑनव्यूक्रेटेड(), और savedInstanceState पर ऑनव्यूक्रेटेड() में outState पर काम करें।

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