美文网首页
android.app.Fragment$Instantiati

android.app.Fragment$Instantiati

作者: 手微凉_ | 来源:发表于2017-11-22 11:52 被阅读0次

    问题主要跟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$Instantiati

          本文链接:https://www.haomeiwen.com/subject/wmynvxtx.html