2011-05-03 27 views
13

संपादितअजीब टुकड़ा जीवन चक्र त्रुटि

तो ऐसा लगता है कि मेरी FragmentFragmentManager जो यह reinitialize की कोशिश करता है में बरकरार है। अभी भी सुनिश्चित नहीं है कि यह Activity के साथ क्यों नष्ट नहीं हुआ है। लोडिंग संदेश के लिए, यह तब प्रदर्शित होता है जब ListView में एडाप्टर सेट नहीं होता है। हालांकि, एडाप्टर आइटम onCreate और onResume में सेट करें, इसलिए मुझे यकीन नहीं है कि यह लोडिंग स्क्रीन क्यों दिख रही है। फिर भी इस व्यवहार

मूल

मैं चारों ओर टुकड़े के साथ खेल रहा हूँ और एक अजीब त्रुटि है कि ऊपर पॉपिंग है जब मैं स्क्रीन के उन्मुखीकरण को बदलने पर ध्यान के किसी भी स्पष्टीकरण के लिए खुला। यह त्रुटि तब नहीं होनी चाहिए जब स्क्रीन अभिविन्यास बदल जाता है, तो सभी डेटा ऑनक्रेट में पुनर्निर्मित होते हैं। इसके अलावा, onResume() को घूर्णन के बाद दो बार बुलाया जाता है। त्रुटि बनाने के लिए मेरे कदम यहां दिए गए हैं और डीबगर फ़ंक्शन को कैसे मार रहा है।

  • गतिविधि: OnCreate()
  • गतिविधि: onResume()
  • टुकड़ा: onResume()
  • घुमाएँ स्क्रीन
  • गतिविधि: OnCreate()
  • गतिविधि: onResume()
  • टुकड़ा: ऑनर्यूम() (आइटम शून्य हैं, भले ही गतिविधि .onResume() उन्हें सेट करें)
  • टुकड़ा: onResume() (आइटम रिक्त नहीं कर रहे हैं, यही कारण है कि इस दो बार कहा जाता है जा रहा है?)

यह पिछले टुकड़ा onResume के बाद मारा जाता है, गोली एक "लोड हो रहा है ..." संदेश और आइकन प्रदर्शित करता है। सूची में डेटा क्यों प्रदर्शित नहीं किया गया है? मेरा संदेह यह है कि ऑनक्रेट दूसरा टुकड़ा बना रहा है। पहला खंड दृश्य को नष्ट करने वाले अभिविन्यास के कारण अपना डेटा खो देता है, दूसरा खंड डेटा प्राप्त करता है और लोडिंग स्क्रीन कोई डेटा आइटम वाला पहला खंड होता है और दूसरा खंड छिपा हुआ होता है। शायद मैं गलत हो सकता हूँ। Activity की तरह स्क्रीन घुमाए जाने पर टुकड़े क्यों नष्ट नहीं होते हैं? कृपया इस विशिष्ट मुद्दे को हल करने तक कोड की आलोचना न करें। मैं वास्तव में एक ऐप नहीं बना रहा हूं, मैं खंड कार्यक्षमता के साथ प्रयोग कर रहा हूं। धन्यवाद!

मुख्य गतिविधि

private ArrayList<Object> items = new ArrayList<Object>(); 
private MyListFragment mylistFragment; 

public MainActivity() { 
    items.add("Hello"); 
    items.add("World"); 
    items.add("Goodbye"); 
} 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 

    mylistFragment = new MyListFragment(); 
    mylistFragment.setItems(items); 

    ft.add(R.id.container, mylistFragment); 
    ft.commit(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    mylistFragment.setItems(items); 
    mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show(); 
     } 

    }); 
} 

सूची टुकड़ा

private List<Object> items = null; 
private Boolean isSet = false; 

@Override 
public void onResume() { 
    super.onResume(); 
    if(!isSet && items != null) { 
     setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); 
     isSet = true; 
    } 
} 

public void setItems(List<Object> items) { 
    this.items = items; 
    if(this.isResumed()) { 
     setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); 
     isSet = true; 
    } else { 
     isSet = false; 
    } 
} 

उत्तर

5

FragmentManager स्वचालित रूप से मेरे लिए Fragment पुन: होगा। हालांकि, उनके अंदर के डेटा को फिर से शुरू करने की जरूरत है। इसलिए मेरा कोड दूसरा टुकड़ा बना रहा था। लोडिंग स्क्रीन इसलिए थी क्योंकि पहले खंड में अब आइटम का एडाप्टर नहीं था और दूसरा टुकड़ा छुपा था। क्या सिरदर्द है, मुझे लगता है कि FragmentManager को Fragments को नष्ट करना चाहिए ताकि आप उन्हें उनके द्वारा बनाए गए डेटा के साथ फिर से बना सकें।

+1

क्षमा करें लेकिन मैं इस सवाल का जवाब भी स्पष्ट रूप से दिखाई नहीं देता ... कैसे आप इस समस्या को हल खत्म किया? मैं आपके जैसा ही निष्कर्ष आया हूं, हालांकि मुझे इस मुद्दे को आसानी से हल करने का कोई तरीका नहीं मिल रहा है। मतलब है कि आप पुराने टुकड़ों को कैसे मारते हैं और नए किए गए लोगों का उपयोग करते हैं। – Maurycy

+0

आप पुराने टुकड़ा से छुटकारा पाने के लिए और नए प्रयोग करते हैं, FragmentTransaction.replace() फ़ंक्शन उपयोग करना चाहते हैं। तब पुराना एक नया स्थान बदल दिया जाएगा। बस पता है कि डेटा को फिर से लोड करना होगा। – Spidy

0

मेरा मानना ​​है कि यही कारण है कि डियान और अन्य Google उदाहरणों के माध्यम से विभिन्न डेमो में ...वे आम तौर पर स्थिर विधि के माध्यम से एचटीई प्रारंभिकरण की मदद करने का कोई तरीका रखते हैं ... और सेट आर्टमेंट्स।

IIRC, टुकड़ा निर्माण सामग्री बनाने के लिए डिफ़ॉल्ट निर्माता फोन करेंगे, लेकिन केवल setArguments के माध्यम से उचित डेटा के साथ पॉप्युलेट के बारे में जानता है। एंड्रॉयड विकास ब्लॉग पर उदाहरण में ... आईडी विवरण टुकड़ा करने के लिए listactivity से पारित किया जा रहा था,। सेट पैराम्स के नाम के बाद, खंड प्रबंधक इसे पुन: जीवंत करने में सक्षम होना चाहिए।

प्रलेखन विषय पर विरल हो रहा है और मैं चीजों को ठीक कर पाना चाहेंगे, इसलिए यदि तुम लोग प्रतिक्रिया है, मैं इसे सराहना करेंगे।

0

ऐसा लगता है कि समर्थन पुस्तकालय से FragmentActivity का उपयोग कर की बचत होती है और स्वचालित रूप से उदाहरण पुनर्स्थापित करता है। इसलिए, केवल अपने टुकड़ा लेनदेन करते हैं savedInstanceStatenull है।

उदाहरण के लिए, अपने FragmentActivity के onCreate() में, निम्न करें:

if(savedInstanceState == null){ 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction() 
     .replace(R.id.fragment_container, mFragment).commit(); //mFragment is your own defined fragment 
} 
संबंधित मुद्दे