收到错误" Java.lang.IllegalStateException活动已被破坏和QUOT;使用带有ViewPager标签时已被、错误、标签、QUOT

2023-09-11 11:32:07 作者:你走开

我有一个由制表mode.I使用ActionBarSherlock的有5个选项卡,并使用片段被处理的每个选项卡的内容的应用程序。对于TAB2不过,我有一个片段,其中持有这反过来有一些片段页的ViewPager元素的XML文件。当我最初启动应用程序的应用程序,我可以没有任何问题的选项卡之间进行切换,但是当我preSS上TAB2第二次我得到上述错误。主要活动如下:

 公共类MainActivity扩展SherlockFragmentActivity
{
    @覆盖
    保护无效的onCreate(包savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        动作条动作条= 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);

        片段片段1 =新TAB1();
        片段fragment3 =新TAB3();
        片段fragment2 =新TAB2();
        片段fragment5 =新Tab5();
        片段fragment4 =新TAB4();

        tab1.setTabListener(新MyTabListener(片段1));
        tab3.setTabListener(新MyTabListener(fragment3));
        tab2.setTabListener(新MyTabListener(fragment2));
        tab5.setTabListener(新MyTabListener(fragment5));
        tab4.setTabListener(新MyTabListener(fragment4));

        actionBar.addTab(TAB1);
        actionBar.addTab(TAB2);
        actionBar.addTab(TAB3);
        actionBar.addTab(TAB4);
        actionBar.addTab(tab5);

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    }

    类MyTabListener实现ActionBar.TabListener
    {
        片段片段

        公共MyTabListener(片段片段)
        {
            this.fragment =片段;
        }

        @覆盖
        公共无效onTabSelected(com.actionbarsherlock.app.ActionBar.Tab选项卡,FragmentTransaction英尺)
        {
            ft.replace(R.id.fragment_container,片段);
        }

        @覆盖
        公共无效onTabUnselected(com.actionbarsherlock.app.ActionBar.Tab选项卡,FragmentTransaction英尺)
        {

        }

        @覆盖
        公共无效onTabReselected(com.actionbarsherlock.app.ActionBar.Tab选项卡,FragmentTransaction英尺)
        {

        }
    }
}
 

未经ViewPager片段类如下:

 公共类TAB1扩展片段
{
    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState)
    {
        返回inflater.inflate(R.layout.activity_tab1,集装箱,假);
    }
}
 

的片段类与ViewPager如下:

 公共类TAB2扩展片段
{
    ViewPager mViewPager;
    私人MyFragmentPagerAdapter mMyFragmentPagerAdapter;
    私有静态诠释NUMBER_OF_PAGES = 5;

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState)
    {
        查看查看= inflater.inflate(R.layout.activity_tab2,集装箱,假);
        返回查看;
    }

    @覆盖
    公共无效onViewCreated(查看视图,捆绑savedInstanceState)
    {
        super.onViewCreated(查看,savedInstanceState);
        mViewPager =(ViewPager)view.findViewById(R.id.viewpager);
        mMyFragmentPagerAdapter =新MyFragmentPagerAdapter(getChildFragmentManager());
        mViewPager.setAdapter(mMyFragmentPagerAdapter);
    }

    私有静态类MyFragmentPagerAdapter扩展FragmentPagerAdapter
    {
        公共MyFragmentPagerAdapter(FragmentManager FM)
        {
             超(FM);
        }

        @覆盖
        公共片段的getItem(INT指数)
        {
             返回PageFragment.newInstance(我的信息+指数);
        }

        @覆盖
        公众诠释getCount将()
        {
             返回NUMBER_OF_PAGES;
        }
   }
}
 
Java开发之规范

这是我读过的在不同的地方(和请纠正我,如果我错了),这是因为在第二轮的片段经理试图从中不再存在从而使活动重用片段在error.But我不知道为什么发生这种情况在这里,因为我没有使用片段的活性。据logcat的错误是在mViewPager.setAdapter(mMyFragmentPagerAdapter)这行的TAB2类,onViewCreated方法。任何帮助是极大AP preciated ......谢谢你。

 十二月3日至四号:01:05.468:E / AndroidRuntime(2474):致命异常:主要
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):java.lang.IllegalStateException:活动已被破坏
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.view.ViewPager.populate(ViewPager.java:1011)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.view.ViewPager.populate(ViewPager.java:880)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.view.ViewPager.setAdapter(ViewPager.java:433)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在com.example.tabs.Tab2.onViewCreated(Tab2.java:31)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:925)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.support.v4.app.FragmentManagerImpl $ 1.运行(FragmentManager.java:429)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.os.Handler.handleCallback(Handler.java:587)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.os.Handler.dispatchMessage(Handler.java:92)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.os.Looper.loop(Looper.java:123)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在android.app.ActivityThread.main(ActivityThread.java:3687)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在java.lang.reflect.Method.invokeNative(本机方法)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在java.lang.reflect.Method.invoke(Method.java:507)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:842)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
十二月三号至四号:01:05.468:E / AndroidRuntime(2474):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

这似乎是在为嵌套片段新增支持的错误。基本上,孩子 FragmentManager 结束了一个破碎的内部状态,当它从活动分开。一个短期的解决方法是固定的,对我来说是添加以下为 onDetach()每一个的片段您叫 getChildFragmentManager()的:

  @覆盖
公共无效onDetach(){
    super.onDetach();

    尝试 {
        现场childFragmentManager = Fragment.class.getDeclaredField(mChildFragmentManager);
        childFragmentManager.setAccessible(真正的);
        childFragmentManager.set(本,NULL);

    }赶上(NoSuchFieldException E){
        抛出新的RuntimeException(E);
    }赶上(IllegalAccessException E){
        抛出新的RuntimeException(E);
    }
}
 

I have an application that consists of using ActionBarSherlock in tab mode.I have 5 tabs and the content of each tab is handled using fragments. For tab2 though, I have a fragment the xml file of which holds a ViewPager element which in turn has some fragment pages. When I initially start the application the application, I am able to switch between tabs no problem but when I press on tab2 for the second time I get the error mentioned above. The main activity is as follows:

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) 
        {

        }
    }
}

The fragment class without the ViewPager is as follows:

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

The fragment class with the ViewPager is as follows:

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;  
        }  
   }
}

From what I've read in different places (and please correct me if I'm wrong), this happens because the fragment manager on the second pass tries to reuse the fragments from the activity which doesn't exist anymore thus giving the error.But I'm not sure why this happens over here since I'm not using fragment activity. According to logcat the error is in the Tab2 class, onViewCreated method on the line that says mViewPager.setAdapter(mMyFragmentPagerAdapter). Any help is greatly appreciated...Thanks.

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)

解决方案

This seems to be a bug in the newly added support for nested fragments. Basically, the child FragmentManager ends up with a broken internal state when it is detached from the activity. A short-term workaround that fixed it for me is to add the following to onDetach() of every Fragment which you call getChildFragmentManager() on:

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

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}