为什么我必须"无效"我的窗户避免消失碎片?

时间:2015-01-03 12:16:53

标签: android android-fragments

我有一个功能齐全的应用程序,在三个片段之间切换三个标签。然后我对后端进行了一些相当大的更改,但我认为没有任何内容会干扰GUI。但确实如此 - 碎片现在趋于消失。

标签更改如下:

mActiveFragment = null;
switch (index) {
    case 0:
        mActiveFragment = new TabOneFragment();
        getSupportActionBar().setSubtitle("One");
        break;
    case 1:
        mActiveFragment = new TabTwoFragment();
        getSupportActionBar().setSubtitle("Two");
        break;
    case 2:
        mActiveFragment = new TabThreeFragment();
        getSupportActionBar().setSubtitle("Three");
        break;
}

getSupportFragmentManager().beginTransaction().replace(R.id.pnlTabContent, mActiveFragment).commit();

在我做出看似无关的变化之前,这种方法运作得很好。现在,它可以工作几次,然后片段容器保持为空,直到我关闭并重新打开活动。

  • 当碎片消失时,我的操作栏中最右边的按钮也会消失,并且没有任何操作栏按钮似乎有效。
  • 它工作的次数似乎是随机的(但很低,通常是两个或三个标签更改)。
  • 没有抛出任何异常,我看不到对logcat感兴趣的东西(只有来自我的应用程序的常规日志消息)。
  • 片段永远不会为null,并且会执行onActivityCreated,onCreateView和onAttach方法。
  • 片段容器(pnlTabContent)永远不会消失(我将背景颜色更改为红色,以验证)。
  • 片段中的视图在isShown上返回true,这表示没有父视图将其可见性设置为GONE或INVISIBLE。无论如何我检查了整个代码库,发现没有代码改变父容器的可见性。
  • 他们不会出现。

现在,我发现如果我在标签更改后添加此行,标签更改始终有效:

getWindow().addFlags(WindowManager.LayoutParams.LAYOUT_CHANGED);

或任何其他标志。所以我现在需要刷新窗口以防止碎片消失。

有关为何发生这种情况的任何想法?我知道如果没有看到我所做的改变就很难调试,但由于它们非常大,并且分布在20多个不同的文件中,我不认为分享它们有任何意义。因此,我正在寻找可能出错的一般想法。

1 个答案:

答案 0 :(得分:0)

嗯,当然,在处理了这个问题五个小时后,我设法在这里发布问题后立即修复它。

事实证明我的一个更改是在我的ArrayAdapter上调用CalledFromWrongThreadException时修复notifyDataSetChanged的错误修正。由于此类无法访问任何Activity,因此我使用处理程序在UI线程上运行它:

Handler mainHandler = new Handler(context.getMainLooper());
Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        adapter.notifyDataSetChanged();
    }
};
mainHandler.post(myRunnable);

出于某种原因,这对我的活动起了作用。我对处理程序了解不多,但我想我创造了一些不一致的东西。我更改了代码,并从实际活动的runOnUIThread()中运行它,现在一切都可以了。