android - ViewPager के साथ टैब का उपयोग करते समय "Java.lang.IllegalStateException गतिविधि को नष्ट कर दिया गया है" त्रुटि प्राप्त करना




android-fragments android-viewpager (8)

मेरे पास एक ऐसा एप्लिकेशन है जिसमें टैब मोड में एक्शनबैरशेलॉक का उपयोग करना शामिल है। मेरे पास 5 टैब हैं और प्रत्येक टैब की सामग्री को टुकड़ों का उपयोग करके संभाला जाता है। टैब 2 के लिए, मेरे पास एक XML है जिसमें xml फ़ाइल है जिसमें एक ViewPager तत्व है जिसमें बदले में कुछ खंड पृष्ठ हैं। जब मैं प्रारंभ में एप्लिकेशन को एप्लिकेशन शुरू करता हूं, तो मैं टैब के बीच कोई समस्या नहीं बदल पाता हूं, लेकिन जब मैं दूसरी बार टैब 2 पर दबाता हूं तो मुझे उपर्युक्त त्रुटि मिलती है। मुख्य गतिविधि निम्नानुसार है:

public class MainActivity extends SherlockFragmentActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActionBar actionBar = getSupportActionBar();

        ActionBar.Tab tab1 = actionBar.newTab().setText("Tab1");
        ActionBar.Tab tab3 = actionBar.newTab().setText("Tab3");
        ActionBar.Tab tab2 = actionBar.newTab().setText("Tab2");
        ActionBar.Tab tab4 = actionBar.newTab().setText("Tab4");
        ActionBar.Tab tab5 = actionBar.newTab().setText("Tab5");

        Fragment fragment1 = new Tab1();
        Fragment fragment3 = new Tab3();
        Fragment fragment2 = new Tab2();
        Fragment fragment5 = new Tab5();
        Fragment fragment4 = new Tab4();

        tab1.setTabListener(new MyTabListener(fragment1));
        tab3.setTabListener(new MyTabListener(fragment3));
        tab2.setTabListener(new MyTabListener(fragment2));
        tab5.setTabListener(new MyTabListener(fragment5));
        tab4.setTabListener(new MyTabListener(fragment4));

        actionBar.addTab(tab1);
        actionBar.addTab(tab2);
        actionBar.addTab(tab3);
        actionBar.addTab(tab4);
        actionBar.addTab(tab5); 

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    }

    class MyTabListener implements ActionBar.TabListener
    {
        Fragment fragment;

        public MyTabListener(Fragment fragment)
        {
            this.fragment = fragment;
        }

        @Override
        public void onTabSelected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft) 
        {
            ft.replace(R.id.fragment_container,fragment);
        }

        @Override
        public void onTabUnselected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft) 
        {

        }

        @Override
        public void onTabReselected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft) 
        {

        }
    }
}

ViewPager के बिना खंड वर्ग निम्नानुसार है:

public class Tab1 extends Fragment 
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.activity_tab1, container, false);
    }
}

ViewPager के साथ खंड वर्ग निम्नानुसार है:

public class Tab2 extends Fragment 
{
    ViewPager mViewPager;
    private MyFragmentPagerAdapter mMyFragmentPagerAdapter;  
    private static int NUMBER_OF_PAGES = 5;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
    {
        View view =  inflater.inflate(R.layout.activity_tab2, container, false); 
        return view;
    }

    @Override
    public void onViewCreated(View view,Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);
        mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getChildFragmentManager());  
        mViewPager.setAdapter(mMyFragmentPagerAdapter);  
    }

    private static class MyFragmentPagerAdapter extends FragmentPagerAdapter 
    {    
        public MyFragmentPagerAdapter(FragmentManager fm) 
        {  
             super(fm);  
        }  

        @Override  
        public Fragment getItem(int index) 
        {  
             return PageFragment.newInstance("My Message " + index);
        }  

        @Override  
        public int getCount() 
        {  
             return NUMBER_OF_PAGES;  
        }  
   }
}

मैंने अलग-अलग स्थानों में जो पढ़ा है (और यदि मैं गलत हूं तो कृपया मुझे सही करें), ऐसा इसलिए होता है क्योंकि दूसरे पास के खंड प्रबंधक गतिविधि से टुकड़ों का पुन: उपयोग करने का प्रयास करते हैं जो अब त्रुटि नहीं दे रहा है। लेकिन मुझे यकीन नहीं है कि यह क्यों होता है क्योंकि मैं खंड गतिविधि का उपयोग नहीं कर रहा हूं। लॉगकैट के मुताबिक त्रुटि टैब 2 क्लास में है, जो लाइन पर ViewCreated विधि है जो mViewPager.setAdapter (mmyFragmentPagerAdapter) कहती है। किसी भी मदद की बहुत सराहना की है ... धन्यवाद।

03-04 12:01:05.468: E/AndroidRuntime(2474): FATAL EXCEPTION: main
03-04 12:01:05.468: E/AndroidRuntime(2474): java.lang.IllegalStateException: Activity has been destroyed
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.view.ViewPager.populate(ViewPager.java:1011)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.view.ViewPager.populate(ViewPager.java:880)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:433)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at com.example.tabs.Tab2.onViewCreated(Tab2.java:31)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:925)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.os.Handler.handleCallback(Handler.java:587)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.os.Looper.loop(Looper.java:123)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.app.ActivityThread.main(ActivityThread.java:3687)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at java.lang.reflect.Method.invokeNative(Native Method)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at java.lang.reflect.Method.invoke(Method.java:507)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at dalvik.system.NativeStart.main(Native Method)

इसने मुझे ज़मरिन के लिए पागल कर दिया।

मैं इसमें एक टुकड़े के बिना TabLayout के लिए ViewPager कार्यान्वयन के साथ भाग गया, जो खुद को ड्रावरलेआउट में लागू किया गया है:

 - DrawerLayout
   - DrawerFragment
     - TabLayout
     - TabViewPager
       - TabViewPagerFragments

तो आपको अपने ड्रॉवरफ्रैगमेंट में निम्न कोड को लागू करना होगा । सही FragmentManager-Path चुनने के लिए सावधान रहें। क्योंकि आपके पास दो अलग-अलग FragmentManager संदर्भ हो सकते हैं:

  1. Android.Support.V4.App.FragmentManager
  2. Android.App.FragmentManager

-> आप जिस का उपयोग करते हैं उसे चुनें। यदि आप ChildFragmentManager का उपयोग करना चाहते हैं, तो आपको अपने ViewPager के लिए क्लास घोषणा Android.App.FragmentManager का उपयोग करना होगा!

Android.Support.V4.App.FragmentManager

अपने "मुख्य" टुकड़े में निम्नलिखित विधि को कार्यान्वित करें - इस उदाहरण में: ड्रॉवरफ्रैगमेंट

public override void OnDetach() {
    base.OnDetach();
    try {
        Fragment x = this;
        var classRefProp = typeof(Fragment).GetProperty("class_ref", BindingFlags.NonPublic | BindingFlags.Static);
        IntPtr classRef = (IntPtr)classRefProp.GetValue(x);
        var field = JNIEnv.GetFieldID(classRef, "mChildFragmentManager", "Landroid/support/v4/app/FragmentManagerImpl;");
        JNIEnv.SetField(base.Handle, field, IntPtr.Zero);
    }
    catch (Exception e) {
        Log.Debug("Error", e+"");
    }
}

Android.App.FragmentManager

public class TabViewPager: Android.Support.V13.App.FragmentPagerAdapter {}

इसका मतलब है कि आपको ViewPager को Android.App.FragmentManager के साथ init करना था।

अपने "मुख्य" टुकड़े में निम्नलिखित विधि को कार्यान्वित करें - इस उदाहरण में: ड्रॉवरफ्रैगमेंट

public override void OnDetach() {
    base.OnDetach();
    try {
        Fragment x = this;
        var classRefProp = typeof(Fragment).GetProperty("class_ref", BindingFlags.NonPublic | BindingFlags.Static);
        IntPtr classRef = (IntPtr)classRefProp.GetValue(x);
        var field = JNIEnv.GetFieldID(classRef, "mChildFragmentManager", "Landroid/app/FragmentManagerImpl;");
        JNIEnv.SetField(base.Handle, field, IntPtr.Zero);
    }
    catch (Exception e) {
        Log.Debug("Error", e+"");
    }
}

टुकड़े पूरी तरह से शुरू होने से पहले बच्चे FragmentManager तक पहुंचने का प्रयास करते समय मुझे एक ही त्रुटि मिली (यानी गतिविधि से जुड़ा हुआ या कम से कम onCreateView() कहा जाता है)। अन्यथा FragmentManager को उपरोक्त अपवाद के कारण एक null गतिविधि के साथ शुरू किया जाता है।


मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन सुझाए गए उत्तर मेरे अंत में काम नहीं करते थे। मैं इसे यहां छोड़ना चाहता हूं अगर किसी को यह उपयोगी लगेगा।

मैंने क्या किया है:

@Override
public void onResume() {
    super.onResume();
    // add all fragments
    FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
    for(Fragment fragment : fragmentPages){
        String tag = fragment.getClass().getSimpleName();
        fragmentTransaction.add(R.id.contentPanel, fragment, tag);
        if(fragmentPages.indexOf(fragment) != currentPosition){
            fragmentTransaction.hide(fragment);
        } else {
            lastTag = tag;
        }
    }
    fragmentTransaction.commit();
}

फिर:

@Override
public void onPause() {
    super.onPause();
    // remove all attached fragments
    for(Fragment fragment: fragmentPages){
        getChildFragmentManager().beginTransaction().remove(fragment).commit();
    }
}

मुझे बिल्कुल वही समस्या है। मैंने पाया है कि एकमात्र कामकाज, टुकड़ों को एक नए उदाहरण से प्रतिस्थापित करना है, हर बार जब टैब बदल जाते हैं।

ft.replace(R.id.fragment_container, Fragment.instantiate(PlayerMainActivity.this, fragment.getClass().getName()));

असली समाधान नहीं है, लेकिन मुझे पिछले खंड उदाहरण का पुन: उपयोग करने का कोई तरीका नहीं मिला है ...


मुझे यह समस्या थी और मुझे एहसास हुआ क्योंकि मैं अपनी Activity दो बार setContentView(int id) दो बार कॉल कर रहा था


मुझे यह समस्या थी और मुझे यहां समाधान नहीं मिला, इसलिए अगर किसी और को यह समस्या फिर से हो तो मैं अपना समाधान साझा करना चाहता हूं।

मेरे पास यह कोड था:

public void finishAction() {
  onDestroy();
  finish();
}

और लाइन को हटाकर समस्या को हल किया "onDestroy ();"

public void finishAction() {
  finish();
}

कारण मैंने प्रारंभिक कोड लिखा था: मुझे पता है कि जब आप "फिनिश ()" निष्पादित करते हैं तो गतिविधि "ऑनस्ट्रोय ()" पर कॉल करती है, लेकिन मैं धागे का उपयोग कर रहा हूं और मैं यह सुनिश्चित करना चाहता था कि अगली गतिविधि शुरू करने से पहले सभी धागे नष्ट हो जाएं , और ऐसा लगता है कि "फिनिश ()" हमेशा तत्काल नहीं है। मुझे बहुत से "बिटमैप" को संसाधित / कम करने और बड़े "बिटमैप्स" प्रदर्शित करने की आवश्यकता है और मैं अपने ऐप में मेमोरी के उपयोग में सुधार करने के लिए काम कर रहा हूं

अब मैं एक अलग विधि का उपयोग कर धागे को मार दूंगा और मैं इस विधि को "onDestroy ();" से निष्पादित करूंगा और जब मुझे लगता है कि मुझे सभी धागे को मारने की जरूरत है।

public void finishAction() {
  onDestroyThreads();
  finish();
}

मैं खंड में बच्चे के टुकड़े को नल में मजबूर करता हूं और यह मेरी समस्या को हल करता है

fragment = null;

यह कहना चाहता था कि मेरी समस्या एक ऐसी गतिविधि में थी जहां मैंने super.onCreate() नामक पहले super.onCreate() को बनाने के लिए प्रयास किया था। मैंने बस super.onCreate() को फ़ंक्शन के शीर्ष पर ले जाया और ठीक काम किया।





android-nested-fragment