随机碎片问题

3
在我的onCreate方法中,我有以下代码:
// Create new fragment and transaction
myFragment = new MyFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.downPart, myFragment);
transaction.commit();

问题是有时会出现预关闭消息,并显示以下错误。
Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.pakagename.pak1.MyFragmentsActivity: make sure class name exists, is public, and has an empty constructor that is public

有时候我的应用程序能够正常运行,比如连续运行了10次都没有问题,但是有时候就会突然崩溃。我不明白为什么会出现这种随机的崩溃情况,是否可能是由于后台运行的其他应用程序导致CPU速度变慢或占用大量内存,我对这种随机崩溃的行为感到困惑。


布局片段不应该是我的片段吗?只是一个观察。 - Yashwanth Kumar
transaction.replace(R.id.downPart, myFragment);的含义是替换事务中的R.id.downPart(布局文件中的某个部分)为myFragment(自定义碎片)。 - user370305
是的,应该是我的片段看到了我的编辑,但这是在复制到stackoverflow论坛时被忽略的东西,在我的项目中被称为bottomf。不要紧,那不是我的问题,如果有这样的错误,那么它在任何情况下都不会起作用...请注意,我的应用程序大多数时候都运行得非常完美。 - Lukap
1个回答

4
如果您将一个Fragment添加到FragmentManager,Android会保存它们的状态并在应用程序的进程被杀死以回收内存时重新创建它们。将应用程序“最小化”(按下主屏幕键)然后打开许多其他应用程序会导致这种情况发生。当您返回时,只有在错误提示所说的情况下,即该片段类名存在,是公共的,并且具有一个空的公共构造函数时,才能重新创建您的片段。
您没有向我们展示MyFragment的代码,但我猜测其中一个条件不成立。特别是,很可能MyFragment是您活动的(非静态)内部类。内部类只能在外部类的实例中实例化,但是当Android重新创建您的片段时,它会从另一个上下文中进行。这就是为什么将Fragment作为内部类是一个问题。
要修复它,请确保MyFragment是静态内部类或其自己的类,并且构造函数是公共的(或不存在;它将使用默认值)。静态内部类可以存在于其外部类的实例之外(并且无法访问任何实例变量)。
您可以通过启动应用程序后按主屏幕键(onSaveInstanceState将被调用),使用DDMS杀死进程,然后重新启动应用程序来轻松测试此操作。或者,尝试您最初的步骤,在其中打开许多其他应用程序。

嗨Antony,我有一个不同的问题,但它是通过你答案底部描述的测试重新创建的。当我在按home之后杀掉进程时,打开的片段会重叠在彼此上方?它们被添加到后退栈中,所以这是其中一个问题吗? - StuStirling
@DiscoS2 我认为所有这些片段问题都非常相似。你可以创建一个带有一些代码的问题,如果我能回答,我会回答它。否则也许其他人可以帮忙 :) - antonyt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接