संपादितअजीब टुकड़ा जीवन चक्र त्रुटि
तो ऐसा लगता है कि मेरी Fragment
FragmentManager
जो यह 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;
}
}
क्षमा करें लेकिन मैं इस सवाल का जवाब भी स्पष्ट रूप से दिखाई नहीं देता ... कैसे आप इस समस्या को हल खत्म किया? मैं आपके जैसा ही निष्कर्ष आया हूं, हालांकि मुझे इस मुद्दे को आसानी से हल करने का कोई तरीका नहीं मिल रहा है। मतलब है कि आप पुराने टुकड़ों को कैसे मारते हैं और नए किए गए लोगों का उपयोग करते हैं। – Maurycy
आप पुराने टुकड़ा से छुटकारा पाने के लिए और नए प्रयोग करते हैं, FragmentTransaction.replace() फ़ंक्शन उपयोग करना चाहते हैं। तब पुराना एक नया स्थान बदल दिया जाएगा। बस पता है कि डेटा को फिर से लोड करना होगा। – Spidy