Android片段重新实例化错误
在我旋转屏幕之前,我认为我已经很好地完成了对碎片的转换。我收到以下类型的错误: RuntimeException:无法启动活动组件信息{com.ghcssoftware.gedstar/com.ghcssoftware.gedstar.gedstar}:android.support.v4.app.Fragment$InstantiationException:无法实例化Fragment com.ghcssoftware.gedstar.PersonTab$PersonTabFrag:确保类名存在,是公共的,并且有一个公共的空构造函数 所讨论的类确实存在,是公共的,我添加了一个空构造函数,结果没有变化。查看一些示例代码,我确实注意到代码编写方式的一些差异,尽管我也没有看到空构造函数: 1) 有什么理由像许多示例一样将我的片段类声明为“静态”的吗 2) 我是否需要在片段类中实现“newInstance”的使用?为什么要这样做,而不仅仅是有一个构造函数?例如,V14示例之一:Android片段重新实例化错误,android,Android,在我旋转屏幕之前,我认为我已经很好地完成了对碎片的转换。我收到以下类型的错误: RuntimeException:无法启动活动组件信息{com.ghcssoftware.gedstar/com.ghcssoftware.gedstar.gedstar}:android.support.v4.app.Fragment$InstantiationException:无法实例化Fragment com.ghcssoftware.gedstar.PersonTab$PersonTabFrag:确保类名存
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时。