2011-11-26 58 views
4

我原本以为我的转换片段非常好做,直到我旋转屏幕。我收到以下类型的错误:Android的碎片重新实例化错误

RuntimeException:无法启动活动ComponentInfo {com.ghcssoftware.gedstar/com.ghcssoftware.gedstar.GedStar}:android.support.v4.app.Fragment $ InstantiationException:Unable to实例化片段com.ghcssoftware.gedstar.PersonTab $ PersonTabFrag:确保类名存在,是公共的,并且具有公共的空构造函数

有问题的类确实存在,是公共的,并且我添加了一个空构造函数结果没有变化。看一些示例代码,我注意到与我的代码编写方式有一些区别,尽管我没有看到空构造函数:

1)是否有任何理由将我的片段类声明为“static”很多样本是?

2)我需要我的片段类中实现使用“的newInstance”的?为什么这样做,而不是只有一个构造函数?例如从V14样本之一:

public static class CountingFragment extends Fragment { 
    int mNum; 

    /** 
    * Create a new instance of CountingFragment, providing "num" 
    * as an argument. 
    */ 
    static CountingFragment newInstance(int num) { 
     CountingFragment f = new CountingFragment(); 

     // Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

我还是有点生疏了一些Java概念,所以可能失去了一些东西基本。

道格·戈登 GHCS软件

+0

我不知道什么与您的旋转问题的发生,但这页面描述静态类声明的目的是:http:/ /www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html – goto10

回答

4

是否有我的片段类应该声明“静态”因为许多样品的原因吗?

只有当它是一个内部类的东西。由于你的看起来是PersonTab的内部类,所以它需要是静态的。或者,将它移出PersonTab以成为独立的Java类。

我需要我的片段类中实现使用“的newInstance”的?为什么这样做,而不是只有一个构造函数?

这只是一个工厂方法。它不是框架所要求的。

+0

寻找一点澄清:我与应用程序运行的旋转屏幕,我的活动是“重启” - 正确的吗?那么,试图实例化我的片段类的是谁呢?首次启动时,我的活动本身创建该对象并将其添加到其容器视图。轮流之后不会简单地做这件事吗?那为什么它会失败 - 有什么不同? – gordonwd

+0

@gordonwd:“那么,试图实例化我的片段类的是谁?” - 我无法回答这个问题,因为您没有指出是通过“”还是“FragmentTransaction”设置的。 “旋转之后不是简单地做这件事吗?” - 是的。 “为什么它会失败 - 有什么不同?” - 没有区别。请理解我们不介意读者。我们只能通过你提供的证据去寻找。你的证据表明你在片段类声明中存在缺陷,正如我在答案中指出的那样。 – CommonsWare

+0

对不起,马克 - 我意识到这一点。尽管我猜我知道如何解决这个问题,但我想了解一些更好的事情,所以我认为我会放入一些断点,以便我能够看到事情发生错误的地方(在执行“固定”)。我的碎片全部通过交易添加,顺便说一句。我有一个相当复杂的现有的应用程序,并试图采取一些快捷方式,使其片段友好,但你知道这是怎么回事... – gordonwd

0

2)。 传递一个变量throw newInstance函数参数,在你的情况下它是num,允许排除需要在constraint和onCreateView之间传递值的类私有变量。对于int变量它SOVE不算什么,但对于长串... 问候, 尤里