android.app.Fragment$InstantiationException的原因分析

问题主要跟Activity的数据恢复有关,其可能产生的Exception:

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.example.fragmenttest.ExampleFragment: make sure class name exists, is public, and has an empty constructor that is public

每个Fragment必须要有一个无参构造方法,这样该Fragment在Activity恢复状态的时候才可以被实例化。强烈建议,Fragment的子类不要有其他含参构造方法,因为这些构造方法在Fragment重新实例化时不会被调用。取而代之的方式是,通过setArguments(Bundle)设置参数,然后通过getArguments获得参数。

如果的Fragment没有无参构造方法,app在恢复Activity时(例如旋转设备),会出现crash。

方法1:

按照标准来写恢复数据的,onSaveInstanceState、onRestoreInstanceState都是可能用到的方法,并且在onCreate里判断savedInstanceState:

if(savedInstanceState !=null) {// 进行数据恢复}

这里要注意的是你要管理好你要恢复的数据,并且把数据及时传递给你的Fragment,否则也会因为数据问题而报错。(这里fragment使用无参构造)

方法2:

无视数据的恢复,强行重新执行一遍代码。也就是:

@Override

protected void   onCreate(Bundle savedInstanceState) {

                   super.onCreate(null);       

  }

super.onCreate传入null,那么就会忽略掉之前要恢复的数据。这样的方法简单粗暴,不过用户体验会稍差,因为之前用户的操作全部丢失了。举个例子:如果当前Activity是个注册页面,点击注册后跳转后另一个等待页面,因为特殊原因,原本后台挂起的注册Activity被系统杀掉,此时注册失败再次返回注册Activity时,用户之前所输入的所有信息都会丢失。

你可能感兴趣的:(android.app.Fragment$InstantiationException的原因分析)