3

好吧。我在这里的第一个问题。而且我已经找到了一些解决方案,但老实说并没有真正了解后台发生的事情。所以也许有人可以稍微清理一下这些东西。经过几天的调试,我很高兴它可以工作......并希望我没有犯一些严重的错误。那么让我们来看看吧。

我有一些主要活动。只是一个扩展JFeinstein 的SlidingFragmentActivity 的 FragmentActivity。此外,我决定采用片段方式,将任何内容(列表片段、文章片段……)作为片段放入容器中(滑动菜单右侧);我的主容器。到目前为止,一切都很好。

一个重要的片段是我的文章片段。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() 完成交易时,我得到了上述异常。当我只是 commit() 事务时,我得到以下异常:

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

所以这就是错误出现的地方。经过多年的调试和搜索,我在这个问题/答案上找到了一些提示,以便在我的 MainActivity 的 WeakReference 上获取 SupportFragmentManager。我该怎么说。自从我实现了它,它就起作用了。我不得不稍微改变我的更新过程,但它确实有效。但留下一些问题......

行为似乎很相似。第一次创作完美。重新加载相同 - 通过标签找到片段。旋转后,文章仍然显示。当我重新加载具有该状态的片段时,标签找不到它,因此创建了一个新片段,但 commit()-request 不会引发异常。查看调试器内部显示 WeakReference 是某个其他实例(其他 id),而不是所有这一切发生的那个(这个)。这就是我失去情节的地方。..

如果你们中的一些人能给我一些提示,那就太好了!提前致谢!

4

1 回答 1

0

尝试这个:

commitAllowingStateLoss(); instead commit();
于 2017-02-14T18:33:03.087 回答