Android片段重新实例化错误

Android片段重新实例化错误,android,Android,在我旋转屏幕之前,我认为我已经很好地完成了对碎片的转换。我收到以下类型的错误: RuntimeException:无法启动活动组件信息{com.ghcssoftware.gedstar/com.ghcssoftware.gedstar.gedstar}:android.support.v4.app.Fragment$InstantiationException:无法实例化Fragment com.ghcssoftware.gedstar.PersonTab$PersonTabFrag:确保类名存

在我旋转屏幕之前,我认为我已经很好地完成了对碎片的转换。我收到以下类型的错误:

RuntimeException:无法启动活动组件信息{com.ghcssoftware.gedstar/com.ghcssoftware.gedstar.gedstar}:android.support.v4.app.Fragment$InstantiationException:无法实例化Fragment com.ghcssoftware.gedstar.PersonTab$PersonTabFrag:确保类名存在,是公共的,并且有一个公共的空构造函数

所讨论的类确实存在,是公共的,我添加了一个空构造函数,结果没有变化。查看一些示例代码,我确实注意到代码编写方式的一些差异,尽管我也没有看到空构造函数:

1) 有什么理由像许多示例一样将我的片段类声明为“静态”的吗

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软件

有什么理由像许多示例一样将我的片段类声明为“静态”的吗

只有当它是某事物的内部类时。因为您的类似乎是
PersonTab
的内部类,所以它需要是静态的。或者,将其移出
PersonTab
以成为一个独立的Java类

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

这只是一种工厂方法。框架不需要它。

2)。 传递一个变量throw newInstance函数参数(在您的例子中是num),允许排除需要在constractor和onCreateView之间引入值的类私有变量。对于int变量它什么都没有,但是对于长字符串。。。 当做
yury

我不确定你的轮换问题发生了什么,但本页描述了静态类声明的目的:寻求一点澄清:当我在应用程序运行时轮换屏幕时,我的活动“重新启动”——正确吗?那么,是谁试图实例化我的片段类呢?第一次启动时,“我的活动”本身创建对象并将其添加到其容器视图中。在旋转之后,它不会再这样做吗?那么为什么它会失败呢?有什么区别?@gordonwd:“那么,是谁在试图实例化我的片段类?”——我无法回答这个问题,因为您没有指出这是通过
还是
片段事务设置的。“在旋转之后,它不会再这样做吗?”--是的。“那为什么它会失败呢——有什么区别?”——没有区别。请理解我们不是读心术的人。我们只能依据你方提供的证据。你的证据表明你的片段类声明中有一个缺陷,正如我在回答中指出的。对不起,马克——我意识到了这一点。尽管我想我知道如何解决这个问题,但我想更好地了解发生了什么,所以我想我会设置一些断点,这样我就可以看到在什么时候出现了问题(在进行“修复”之前)。顺便说一句,我的片段都是通过事务添加的。我有一个相当复杂的现有应用程序,并试图通过一些快捷方式使其对片段友好,但你知道这是怎么回事…@gordonwd:为了澄清前面的一点,如果你的片段是动态的,并且你有
setRetainInstance(true)
,然后,不应重新创建片段,而应在活动实例之间携带片段。但我现在同样感到困惑——如果一切都是动态的,我就不会期望看到堆栈跟踪。好的,您是唯一一个创建片段的人,只有当系统尝试创建片段时(例如,通过
),才会发生该错误。如果你想到了,请用你的解决方案回复,因为我很想知道哪里出了问题。我的片段是动态的,不在后堆栈中(它是我“主”应用程序的一部分),我没有设置RetainInstance(true)。但是Android正在尝试创建一个新的实例,因为上面的错误发生在我的活动的onCreate在配置更改后调用super.onCreate时。