17

मेरा एप्लिकेशन बंद हो जाता है जब मैं अपनी स्क्रीन बंद करता हूं और उसे वापस चालू करता हूं।ViewPager पेजर ऑब्सर्वर पंजीकृत नहीं था

लॉगकैट मुझे बताता है कि इस त्रुटि का कारण मेरे पाठ्यक्रमफ्रैगमेंट.क्लास में जावा लाइन 60 को इंगित कर रहा है जो टुकड़े को बढ़ाता है।

mViewPager.setAdapter(infoTechPageAdapter); 

मैं अपने कोर्सफ्रैगमेंट.क्लास में एक व्यूपेगर लागू कर रहा हूं जो टुकड़े को बढ़ाता है।

यहाँ मेरी कोड है:

public class CourseFragment extends Fragment { 

public static final String ARG_POSITION_NUMBER = "course_number"; 

private int position; 

public CourseFragment() { 
    // Empty constructor required for fragment subclasses 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView; 
    position = getArguments().getInt("position"); 

    String course = getResources().getStringArray(
      R.array.array_navigation_drawer)[position]; 

    getActivity().setTitle(course); 

    rootView = inflater.inflate(R.layout.activity_drawer_fragment, 
      container, false); 

    return rootView; 
}// end onCreateView 

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

    ViewPager mViewPager = (ViewPager) getActivity().findViewById(
      R.id.pagerYear); 

    Log.i("posit", String.valueOf(position)); 
    switch (position) { 

    case 0: 
     InfoTechPageAdapter infoTechPageAdapter = new InfoTechPageAdapter(
       getActivity().getSupportFragmentManager()); 
     mViewPager.setAdapter(infoTechPageAdapter); 
     break; 

    case 1: 
     ComSciPageAdapter comSciPageAdapter = new ComSciPageAdapter(
       getActivity().getSupportFragmentManager()); 
     mViewPager.setAdapter(comSciPageAdapter); 
     break; 

    case 2: 
     ProfilePageAdapter profilePageAdapter = new ProfilePageAdapter(
       getActivity().getSupportFragmentManager()); 
     mViewPager.setAdapter(profilePageAdapter); 
     break; 
    } 

}// end onStart 
} 

Logcat

09-22 10:54:03.830: E/AndroidRuntime(2917): FATAL EXCEPTION: main 
09-22 10:54:03.830: E/AndroidRuntime(2917): java.lang.IllegalStateException: Observer [email protected] was not registered. 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.database.Observable.unregisterObserver(Observable.java:69) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.view.PagerAdapter.unregisterDataSetObserver(PagerAdapter.java:294) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.usjr.sss.adapter.InfoTechPageAdapter.unregisterDataSetObserver(InfoTechPageAdapter.java:21) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:409) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.usjr.sss.fragment.CourseFragment.onStart(CourseFragment.java:60) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.Fragment.performStart(Fragment.java:1502) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:415) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.usjr.sss.fragment.CourseFragment.onStart(CourseFragment.java:60) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.Fragment.performStart(Fragment.java:1502) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1882) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:573) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1164) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.Activity.performStart(Activity.java:5114) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.Activity.performRestart(Activity.java:5169) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.ActivityThread.handleSleeping(ActivityThread.java:3408) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.ActivityThread.access$2700(ActivityThread.java:153) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1426) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.os.Looper.loop(Looper.java:137) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at android.app.ActivityThread.main(ActivityThread.java:5227) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
09-22 10:54:03.830: E/AndroidRuntime(2917):  at dalvik.system.NativeStart.main(Native Method) 
+7

1. क्या 'ViewPager'' R.layout.activity_drawer_fragment' लेआउट में घोषित किया गया है? यदि हां, तो 'getActivity()। FindViewById (R.id.pagerYear) का उपयोग न करें; इसे खोजने के लिए, इसके बजाय सीधे टुकड़े के दृश्य का उपयोग करें:' getView()। FindViewById (R.id.pagerYear); '2. फिर, यदि' ViewPagerment' में 'ViewPager' का उपयोग किया जाना है, तो 'getActivity() के बजाय' getChildFragmentManager() '' InfoTechPageAdapter' (और शेष एडाप्टर) को पास करें। GetSupportFragmentManager() '। – Luksprog

+0

मैं प्रभावित हूं। तुम बहुत अच्छे हो[email protected] _ @ मेरे पास एक और मुद्दा है लेकिन अगर मैं समाधान नहीं ढूंढ पा रहा हूं तो शायद मैं इसे बाद में पोस्ट करूंगा, आशा करता हूं कि आप इसके साथ मेरी मदद भी कर सकते हैं। बहुत बहुत धन्यवाद। – Marss

+0

वास्तव में ... मुझे नहीं पता कि धन्यवाद कैसे कहना है .... आप वास्तव में अच्छे हैं, मुझे नहीं पता था कि मुझे आपकी टिप्पणी कैसे मिलती है ... कृपया टिप्पणी को उत्तर के रूप में रखें :) ताकि प्रत्येक व्यक्ति देख सके उन्हें जल्दी ... मुझे लगता है कि किसी और ने इस समाधान को नहीं रखा .. –

उत्तर

43

के रूप में एक टिप्पणी में @Luksprog से कहा, आप को बदलने की जरूरत

getActivity().getSupportFragmentManager() 

getChildFragmentManager() 
के लिए

क्यों: getSupportFragmentManager() (और getFragmentManager()) इस खंड की गतिविधि से जुड़े टुकड़ों के साथ बातचीत करने के लिए प्रयोग किया जाता है, जो आप नहीं चाहते हैं।

आप जो चाहते हैं वह इस टुकड़े (आपके एडाप्टर का उपयोग करके) के टुकड़े को व्यवस्थित करना और प्रबंधित करना है, जो getChildFragmentManager() विधि का विवरण है।

पॉइंटर के लिए @Luksprog का एक बड़ा धन्यवाद; मुझे वही समस्या थी जो आपने किया था, और उसका जवाब था! बस अपने उत्तर को एक वास्तविक उत्तर में पोस्ट करना, उन लोगों के लिए जो शायद इस मुद्दे के उत्तर के लिए टिप्पणियों को देखना न सोचें।

+0

अगर मुझे एंड्रॉइड 4.0 और 4.1 पर ChildFragmentManager() नहीं मिलता है तो मुझे क्या करना चाहिए? –

+1

@ RomulusUrakagiTs'ai: यह विधि [समर्थन लाइब्रेरी] से भी उपलब्ध है (http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()), जो आपको चाहिए यदि आप पुराने एंड्रॉइड संस्करणों का समर्थन करना चाहते हैं तो हमेशा उपयोग करें। –

+0

बहुत से लोग शायद इस उदाहरण पर ['ViewPager'] (http://developer.android.com/reference/android/support/v4/view/ViewPager.html) के रूप में इस पर कदम उठाए हैं, बस 'सुपर (गतिविधि .getFragmentManager ()); 'ctor पर ... :( – Diederik

3

मुझे यह समस्या हो रही थी, भले ही मैं 100% था कि मैं सही FragmentManager का उपयोग कर रहा था। ViewPager's adapter प्रारंभ करते समय मैंने इसे शून्य जांच करके हल किया।

if(pager.getAdapter() == null) 
    pager.setAdapter(pagerAdapter); 

स्टैकट्रेस अध्ययन करने के बाद मुझे लगता है कि समस्या यह है कि ViewPager जब पुराने एडाप्टर रिहा वर्ष कैश्ड टुकड़े को नष्ट करने की कोशिश कर रहा है और कुछ गलत हो रहा है क्योंकि टुकड़े वास्तव में कभी दिखाई दे रहे थे है। हालांकि यह सिर्फ एक अनुमान है।

0

मुझे एंड्रॉइड स्टूडियो जेनरेट कोड का उपयोग करके यह समस्या थी और onStart() प्रत्येक बार इसे बनाने से पहले page.getAdapter() == null चेक के साथ उपरोक्त कार्य का उपयोग किया गया।

अंतिम कोड:

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

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    if(mViewPager.getAdapter() == null) { 
     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the activity. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager()); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
    } 
} 

केवल समस्या मैं अब है कि वापस बटन दबाने ठीक से काम करने दो बार किया जाना चाहिए है। सुनिश्चित नहीं है कि यह एक इरादा या टुकड़ा मुद्दा है ...

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