随机碎片问题

时间:2011-10-19 10:14:58

标签: android android-fragments fragment

在我的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或占用大量内存,我真的不明白这种随机行为

1 个答案:

答案 0 :(得分:4)

如果您向Fragment添加FragmentManager,Android将保存其状态并重新创建它们,如果应用程序的进程被杀死以回收内存等。“最小化”您的应用程序(按回家)然后打开许多其他应用程序将导致此。当你返回时,它只能重建你的片段,如错误所说,片段类名存在,是公共的,并且有一个空的公共构造函数。

您尚未向我们展示MyFragment的代码,但我猜其中一个条件不正确。特别是,MyFragment很可能是您活动的(非静态)内部类。内部类只能在外部类的实例中实例化,但Android在重新创建片段时会从另一个上下文中执行此操作。这就是将Fragment作为内部类的问题。

要修复它,请确保MyFragment是静态内部类或其自己的类,并且构造函数是公共的(或不存在;它将使用默认值)。静态内部类可以在没有外部类的实例的情况下存在(并且不能访问任何实例变量)。

您可以通过在启动应用程序后按home(可以调用onSaveInstanceState)轻松测试,使用DDMS终止进程,然后重新启动应用程序。或者,尝试使用原始步骤,在其中打开许多其他应用程序。