2013-09-05 6 views
23

संपादित 2FragmentStatePagerAdapter - NullPointerException में FragmentManagerImpl.getFragment परिणाम

मैं अब यहाँ https://code.google.com/p/android/issues/detail?id=42601#c10 से चाल का उपयोग इतना है कि reoson क्यों मेरे पिछले संपादन के शीर्ष पर रखा है के साथ त्रुटि से छुटकारा पाने में कामयाब मेरा प्रश्न।

लेकिन यह अगले त्रुटि हुई थी:

java.lang.NullPointerException 
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569) 
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211) 
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1281) 
at android.view.View.dispatchRestoreInstanceState(View.java:12043) 
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2688) 
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694) 
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694) 
at android.view.View.restoreHierarchyState(View.java:12021) 
at android.support.v4.app.Fragment.restoreViewState(Fragment.java:425) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:949) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4800) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
at dalvik.system.NativeStart.main(Native Method) 

और अब मैं जारी रखने के लिए जहां पता नहीं है ...

संपादित करें 0 - पहला सवाल

मैं निम्नलिखित मिल अपवाद:

java.lang.IllegalStateException: No activity 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1091) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) 
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877) 
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1492) 
at android.support.v4.app._HoloFragment.performActivityCreated(_HoloFragment.java:251) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4800) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
at dalvik.system.NativeStart.main(Native Method) 

मुझे कोई जानकारी नहीं है कहा से शुरुवात करे। मैं अद्यतित समर्थन पुस्तकालय (v4, rev18) का उपयोग कर रहा हूँ।

सब कुछ ठीक काम करता है जब तक कि मैं Fragment जोड़ता हूं जिसमें के साथ संयोजन में ViewPager होता है।

मैं समर्थन लाइब्रेरी हर जगह उपयोग कर रहा हूँ, मैं https://code.google.com/p/android/issues/detail?id=42601 से समाधान करने की कोशिश की ...

लेकिन कुछ भी नहीं अभी तक काम किया ...

मैं कहाँ शुरू करने के लिए पता नहीं है, करता है किसी को भी एक है संकेत?

संपादित करें 1: पृष्ठभूमि और कोड

1) मेरी MainActivity में मैं निम्नलिखित का उपयोग करें:

तीसरे पृष्ठ है viewpager ...

public void setPage(int pos, boolean addToBackStack) 
{ 
    Fragment nextFragment = null; 
    FragmentTransaction transaction = null; 

    switch (pos) 
    { 
     case 0: 
      if (mFragmentAllRoutines == null) 
       mFragmentAllRoutines = new RoutinesListFragment(); 
      if (!mFragmentAllRoutines.isVisible()) 
       nextFragment = mFragmentAllRoutines; 
      break; 
     case 1: 
      if (mFragmentRoutine == null) 
       mFragmentRoutine = new RoutineFragment(); 
      if (!mFragmentRoutine.isVisible()) 
       nextFragment = mFragmentRoutine; 
      break; 
     case 2: 
      if (mFragmentDay == null) 
       mFragmentDay = new RoutineDayFragment(); 
      if (!mFragmentDay.isVisible()) 
       nextFragment = mFragmentDay; 
      break; 
     default: 
      break; 
    } 

    if (nextFragment != null) 
    { 
     // Fragment prevFragment = getSupportFragmentManager().findFragmentById(R.id.fragment); 
     transaction = getSupportFragmentManager().beginTransaction(); 
     // if (prevFragment != null) 
     // transaction.detach(prevFragment); 
     transaction.replace(R.id.fragment, nextFragment, nextFragment.getClass().getName()); 
     // transaction.attach(nextFragment); 
     if (addToBackStack) 
      transaction.addToBackStack(null); 
     transaction.commit(); 
    } 
} 

2) तीसरा टुकड़ा:

यह व्यूपेजर और फ्रैमेमे के साथ एक साधारण टुकड़ा है ntStatePagerAdapter। FragmentStatePagerAdapter को getChildFragmentManager() को FragmentManager के रूप में प्राप्त करें। और कहीं भी समस्या प्रतीत होती है।

+0

अपना प्रासंगिक कोड –

+0

पोस्ट करें अपना पूरा स्टैक ट्रेस, लॉगकैट आउटपुट .. और अपना कोड भी पोस्ट करें। –

+0

मैंने अपना प्रश्न और मेरी समस्या की वर्तमान स्थिति अपडेट की ... – prom85

उत्तर

59

मुझे यह जानने के लिए और कोड देखने की आवश्यकता होगी कि यह कहां लागू किया जाए ... लेकिन मेरे पास एक जैसी स्थिति थी जैसा आपने किया था ... मैंने ChildFragmentManager समस्या को हल किया, और उसी NullPointerException को मिला आपके पास।

मैंने इसे हल करने का प्रबंधन किया ... मैं आपके समाधान का वर्णन करने की कोशिश करूंगा, जैसा कि आपने प्रदान किया गया कोड के साथ मैं अनिश्चित हूं कि "ठीक करें" कहां लागू करें ... यह वास्तव में एक फिक्स है .. यह हल करने के लिए यह एक शानदार तरीका नहीं है! हालांकि उसने मुझे मदद की, और जब मैं पेजर को देखने पर नेविगेट करता हूं तो मुझे राज्यों को पुनर्स्थापित करने की आवश्यकता नहीं होती है, इसलिए मेरे लिए कोई नकारात्मक नहीं है।

मेरे पास कई टुकड़े हैं, जो कोड के स्थिर बिट को लागू करते हैं और ऑनडेट (https://code.google.com/p/android/issues/detail?id=42601#c10 पर), प्रत्येक खंड में एक पेजर होता है, और क्रिएटिव्यू मैं एक एडाप्टर संलग्न करता हूं जो FragmentStatePagerAdapter को बढ़ाता है।

उन एडेप्टर पर मैं फिर से कुछ भी नहीं

@Override 
public void restoreState(Parcelable arg0, ClassLoader arg1) { 
    //do nothing here! no call to super.restoreState(arg0, arg1); 
} 

करने के लिए restoreState विधि अधिरोहित किया है, यह सबसे अच्छा तरीका नहीं है ... लेकिन यह हल मेरी समस्या से किया था।

शुभकामनाएँ!

+1

धन्यवाद !!! एक जादू की तरह काम किया। – KVISH

+0

ऐसा क्यों होता है? क्या नतीजे सामने आए? क्या यह एक ज्ञात मुद्दा है जिसे भविष्य में तय किया जाएगा? –

+6

"ऐसा क्यों होता है? परिणाम क्या हैं? क्या यह ज्ञात मुद्दा है जो भविष्य में तय किया जाएगा?" (ए) कोई नहीं जानता, (बी) कोई नहीं जानता, (सी) शायद नहीं। लेकिन ऐसा लगता है कि मेरे लिए काम करता है। (एंड्रॉइड में आपका स्वागत है) –

1

मेरी तरफ, मैं एक युक्त खंड में व्यूपेगर टुकड़ों का संदर्भ रख रहा था और अपने राज्यों को स्टोर करने के लिए SaveInstanceState पर उपयोग कर रहा था। मुझे लगता है कि एनपीई हुआ क्योंकि यह खंडों को पुनर्स्थापित करने के लिए ViewPager स्वयं तंत्र के साथ टकरा रहा था। मैंने जो किया, मेरे आर्किटेक्चर को व्यूपेजर से खंडित लेनदेन में बदलकर मैं स्वयं का प्रबंधन करता हूं। (ViewPager मेरे मामले के लिए उपयुक्त समाधान नहीं था)

0

सबसे पहले, अंग्रेजी मेरी मातृभाषा नहीं है, अगर मेरे पास व्याकरण में कुछ गड़बड़ है, तो कृपया मुझे बताएं। मुझे अपनी परियोजना में इस समस्या का सामना करना पड़ा। सबसे पहले मैंने मार्क ने कहा, और यह अच्छी तरह से काम किया। लेकिन जब मैंने पिता के टुकड़े में एक और व्यूपेगर जोड़ा, तो नया व्यूपेजर पुराने जैसा ही दिखाया गया, इससे कोई फर्क नहीं पड़ता कि इस नए व्यूअर में किस तरह का कोड है। आखिरकार मुझे कारण मिला। हम हमेशा FragmentTrasaction.replace (R.layout.fragment, खंड) विधि का उपयोग करके टुकड़ा बनाते हैं। इस वजह से, हम इस विधि का उपयोग करते समय एक नया खंड उदाहरण बनाते हैं। प्रतिस्थापन() विधि का उपयोग करने के बजाय, मैं खंड को स्विच करने के लिए FragmentTransaction.hide() और शो() विधि का उपयोग करता हूं। मैंने इस तरह अपनी समस्या हल की।

@Override 
public void onClick(View v) { 
    FragmentTransaction transaction = fm.beginTransaction(); 
    switch (v.getId()) { 
     case R.id.tv_schedule_day: 
     hideFragment(transaction); 
     if (dayFragment == null) { 
      dayFragment = new ScheduleDayFragment(); 
      transaction.add(R.id.ll_schedule_content, dayFragment); 
     } else { 
      transaction.show(dayFragment); 
     } 
     transaction.commit(); 
     break; 
     case R.id.tv_schedule_week: 
     hideFragment(transaction); 
     if (weekFragment == null) { 
      weekFragment = new ScheduleWeekFragment(); 
      transaction.add(R.id.ll_schedule_content, weekFragment); 
     } else { 
      transaction.show(weekFragment); 
     } 
     transaction.commit(); 
     break; 
    case R.id.tv_schedule_month: 
     hideFragment(transaction); 
     if (monthFragment == null) { 
      monthFragment = new ScheduleMonthFragment(); 
      transaction.add(R.id.ll_schedule_content, monthFragment); 
     } else { 
      transaction.show(monthFragment); 
     } 
     transaction.commit(); 
     break; 

private void hideFragment(FragmentTransaction transaction) { 
    if (dayFragment != null) { 
     transaction.hide(dayFragment); 
    } 
    if (weekFragment != null) { 
     transaction.hide(weekFragment); 
    } 
    if (monthFragment != null) { 
     transaction.hide(monthFragment); 
    } 
} 

मैं छिपाने() और शो() तरीकों का उपयोग स्विच पिता टुकड़ा बनाने के लिए है, इसलिए जब मैं एम्बेडेड टुकड़ा में getChildFragmentManager() का उपयोग करें, यह शून्य वापस नहीं wolud: यहाँ मेरी कोड के टुकड़े है। 2013 में यह सवाल पूछा गया था, मुझे लगता है कि कोई भी इस जवाब को नहीं देख पाएगा, लेकिन मैं अभी भी इस सवाल को स्वीकार करने में बहुत खुश हूं।

4

मैंने अभी भी एक ही समस्या पर ठोकर खाई है।

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 
    at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:873) 
    at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215) 

मार्क द्वारा समाधान काम करता है लेकिन मेरे मामले में यह FragmentStatePagerAdapter के साथ फ्रैगमेंट पर लेट गया। इसलिए मैंने बहाल किया गया स्टार्टस्टेट, जिसे सुपर कहा जाता है, इसे कोशिश/पकड़ में लपेटा और यह बिना किसी झगड़े के काम करता था।

@Override 
public void restoreState(Parcelable state, ClassLoader loader) { 
    try{ 
     super.restoreState(state, loader); 
    }catch (NullPointerException e){ 
     // null caught 
    } 
} 
+0

कोई विचार नहीं था कि समस्या कहां थी लेकिन यह जवाब ठीक है!धन्यवाद – michgauz

+0

मुझे नहीं पता कि यह किसी गहरे और रहस्यमय तरीके से एप्लिकेशन के लिए हानिकारक है या नहीं। लेकिन मैं इसे आजमाने की कोशिश कर रहा हूं। –

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