我有一个功能齐全的应用程序,在三个片段之间切换三个标签。然后我对后端进行了一些相当大的更改,但我认为没有任何内容会干扰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();
在我做出看似无关的变化之前,这种方法运作得很好。现在,它可以工作几次,然后片段容器保持为空,直到我关闭并重新打开活动。
现在,我发现如果我在标签更改后添加此行,标签更改始终有效:
getWindow().addFlags(WindowManager.LayoutParams.LAYOUT_CHANGED);
或任何其他标志。所以我现在需要刷新窗口以防止碎片消失。
有关为何发生这种情况的任何想法?我知道如果没有看到我所做的改变就很难调试,但由于它们非常大,并且分布在20多个不同的文件中,我不认为分享它们有任何意义。因此,我正在寻找可能出错的一般想法。
答案 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()中运行它,现在一切都可以了。