在使用带有ViewPager的选项卡时

在使用带有ViewPager的选项卡时,获取错误“Java.lang.IllegalStateException活动已被销毁”

我有一个应用程序,包括在选项卡模式中使用ActionBarSherlock,我有5个选项卡,每个选项卡的内容都是使用片段处理的。但是对于表2,我有一个片段,其中的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);
    }

从我在不同地方读到的内容来看(如果我错了,请纠正我),这是因为第二遍中的片段管理器试图重用活动中的片段,这已经不存在了,从而产生了错误,但我不知道为什么会在这里发生这种情况,因为我没有使用片段活动。根据logcat,错误出现在表2类中,onViewCreated方法的行上写着mViewPager.setAdapter(mMyFragmentPagerAdapter).任何帮助都是非常感谢的.谢谢。


catspeake
浏览 448回答 3
3回答

收到一只叮咚

这似乎是新添加的对嵌套片段的支持中的一个bug。基本上,孩子FragmentManager当与活动分离时,其内部状态会中断。为我解决这个问题的一个短期解决办法是添加以下内容onDetach()每一个Fragment你称之为getChildFragmentManager()关于:@Overridepublic 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);     }}

慕田峪4524236

我也有同样的问题。我找到的唯一解决办法是,每次更改选项卡时,用一个新实例替换这些片段。ft.replace(R.id.fragment_container, Fragment.instantiate(PlayerMainActivity.this, fragment.getClass().getName()));不是真正的解决方案,但我还没有找到重用上一个片段实例的方法.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android