मेरे पास एक टुकड़ा है जिसमें इसका अपना राज्य है (चयनित बटन, आदि)। वह स्क्रीन स्क्रीन रोटेशन पर खो जाती है।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()
क्यों नहीं कहा जा रहा है?
कोशिश करें और @ ओवरराइड 'पर रोकें()'/'ऑनर्यूम()'। –
रोटेशन पर बुलाया गया आदेश ऑनपॉज़(), ऑनस्ट्रोय(), ऑनक्रेट(), ऑनक्रेटिव्यू() पर, एक्टिविटीक्रेटेड(), ऑनस्यूम() पर है। SaveInstanceState अभी भी हमेशा शून्य है, और SaveInstanceState() पर कभी नहीं कहा जाता है। मुझे पूरा यकीन है कि मुझे कहीं भी SaveInstanceState() पर स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है? – George
क्या समस्या दो अलग-अलग स्थानों (पोर्ट्रेट लेआउट बनाम लैंडस्केप लेआउट) में संदर्भित खंड के साथ कुछ करने के लिए है? शायद यह एंड्रॉइड को संकेत दे रहा है कि ये दो अलग-अलग टुकड़े हैं जिन्हें राज्य साझा नहीं करना चाहिए? – George