3

好的。我的第一个问题。我已经找到了一些解决方案,但老实说,并没有真正获得后台发生的事情。所以也许有人能够澄清这个问题。经过几天的调试,我很高兴它可以工作......并希望我没有犯一些严重的错误。所以我们来看看。方向变化,FragmentTransaction,活动已被破坏,WeakReference

我有一些主要活动。只是一个片段活动延伸JFeinstein’s SlidingFragmentActivity。此外,我决定采用片段方式,并将任何内容(list-fragment,art​​icle-fragment,...)作为片段放入一个容器中(滑动菜单的右侧)。我的主容器。到现在为止还挺好。

一个重要的片段是我的文章片段。一个ViewPager(带有FragmentStatePagerAdapter) - 包含一些带有文本和可能是另一个列表片段的页面。到目前为止,仍然没有问题,直到我决定旋转设备。更准确地说,只要我不决定更新我的文章片段,旋转设备也会起作用。

我明白(纠正我,如果我错了),Android在旋转设备时自行处理碎片状态。这似乎是一切正常,直到我想重新加载/更新其内容。好吧,让我们深入了解一下。 第一次启动时,我收到了一些空的主容器。然后我第一次加载我的文章片段。只需获取SupportFragmentAdapter,创建我的ArticleFragment并用新创建的片段替换主容器 - 标记。没有火箭科学 - 只是一个简单的事务:

ViewPagerFragment pagerFragment = (ViewPagerFragment) 
    getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT_ARTICLE); 

if(pagerFragment != null){ 
    if(pagerFragment.isResumed()){ 
     pagerFragment.triggerReload(); 
    } 
} else { 
    pagerFragment = new ViewPagerFragment(); 
    FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
    t.replace(R.id.id_main_root_frame, pagerFragment, TAG_FRAGMENT_ARTICLE); 
    t.commitAllowingStateLoss(); 
} 

避免每次我重装我的内容时创建一个片段,我想在交易之前并获取片段 - 如果它是发现和恢复 - 触发一些重新加载现有片段。

现在我旋转我的设备在这种状态。为了避免与片段状态混乱,我在片段内保留了onSaveInstanceState()。所以我猜这个片段只是被破坏并重新创建。一切仍然有效。但我认为这部分有一些黑盒子。

之后 - 正常启动,创建片段并放入主容器,旋转设备 - 我触发一些更新。但是不是通过标签找到旧的(重新创建的)片段,而是找到未找到的并且创建并插入新的片段。至少试图插入,因为这是我得到了以下异常:

java.lang.IllegalStateException: Activity has been destroyed 

准确地说,我得到了上面的异常时,完成我的交易有commitAllowingStateLoss()。当我刚刚提交()的交易,我得到以下异常:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

所以这就是错误出现。经过多年的调试和搜索,我在this question/answer上发现了一些提示,让我的MainActivity的WeakReference获得SupportFragmentManager。我该怎么说。自从我实现了它,它就起作用了。我不得不改变我的更新过程,但它有效。但留下一些问题...

行为似乎是相似的。第一次创作完美。重新加载相同 - 片段是通过标签找到的。旋转后,文章仍然显示。当我用这个状态重新加载片段时,它不会被标签找到,所以创建一个新的片段,但是commit() - 请求不会引发异常。调试器里面的内容显示WeakReference是其他实例(其他实例),比所有这些都发生在其中。那就是我失去了阴谋的地方。 ..

如果你们中有些人可以给我一些提示,那会很棒! 在此先感谢!

+0

我有相同的问题,并没有丝毫的线索,为什么它是表现这种方式。超级沮丧,因为这些东西都没有记录。 – dcow 2013-08-26 21:23:57

回答

0

试试这个:

commitAllowingStateLoss(); instead commit();