Android 无法实例化片段-java.lang.RuntimeException
嘿,伙计们,我从我的开发者控制台得到了这个堆栈跟踪。好吧,我不确定是什么导致了这次车祸。因为在测试我的应用程序时,我自己从来没有遇到过这个错误,只是从GooglePlay的开发者控制台得到的Android 无法实例化片段-java.lang.RuntimeException,android,fragment,Android,Fragment,嘿,伙计们,我从我的开发者控制台得到了这个堆栈跟踪。好吧,我不确定是什么导致了这次车祸。因为在测试我的应用程序时,我自己从来没有遇到过这个错误,只是从GooglePlay的开发者控制台得到的 java.lang.RuntimeException: Unable to start activity ComponentInfo{package.name/package.name.activity.SomeActivity}: android.support.v4.app.Fragment$Insta
java.lang.RuntimeException: Unable to start activity ComponentInfo{package.name/package.name.activity.SomeActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment package.name.photopreview.PhotoThumbnailFragmentAdapter$1: make sure class name exists, is public, and has an empty constructor that is public
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
at android.app.ActivityThread.access$700(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment streetdirectory.mobile.modules.photopreview.PhotoThumbnailFragmentAdapter$1: make sure class name exists, is public, and has an empty constructor that is public
at android.support.v4.app.Fragment.instantiate(Fragment.java:399)
at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1760)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:200)
at streetdirectory.mobile.modules.businessdetail.BusinessDetailActivity.onCreate(BusinessDetailActivity.java:134)
at android.app.Activity.performCreate(Activity.java:5188)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
... 11 more
Caused by: java.lang.InstantiationException: can't instantiate class streetdirectory.mobile.modules.photopreview.PhotoThumbnailFragmentAdapter$1; no empty constructor
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.support.v4.app.Fragment.instantiate(Fragment.java:388)
... 18 more
有人能帮我分析这个问题吗?并给我一些有用的建议。
谢谢,问候
编辑
这是光预览碎片适配器代码
public class PhotoPreviewFragmentAdapter<T extends ImageListServiceOutput> extends FragmentPagerAdapter {
private ArrayList<T> mData = new ArrayList<T>();
public PhotoPreviewFragmentAdapter(FragmentManager fm) {
super(fm);
}
public void setData(ArrayList<T> data) {
mData = data;
}
@SuppressLint("ValidFragment")
@Override
public Fragment getItem(final int position) {
PhotoPreviewFragment view = new PhotoPreviewFragment() {
@Override
public ImageListServiceOutput getData() {
if (position < mData.size()) {
return mData.get(position);
}
return null;
}
};
return view;
}
@Override
public int getCount() {
// TODO Add Photo Button
//return mData.size()+1;
return mData.size();
}
}
公共类PhotoPreviewFragmentAdapter扩展FragmentPagerAdapter{
private ArrayList mData=new ArrayList();
公共照片预览碎片适配器(碎片管理器fm){
超级(fm);
}
公共void setData(ArrayList数据){
mData=数据;
}
@SuppressLint(“有效碎片”)
@凌驾
公共片段getItem(最终int位置){
PhotoPreviewFragment视图=新的PhotoPreviewFragment(){
@凌驾
公共ImageListServiceOutput getData(){
如果(位置
给我一些关于如何重现这次崩溃的线索可能会对我有很大帮助。谢谢
编辑
可能问题在于(就像波士顿街道所说的)PhotoTumbnailFragmentAdapter中的匿名内部类,我在这个方法中使用了它
public Fragment getItem(final int position) {
PhotoThumbnailFragment view = new PhotoThumbnailFragment() {
@Override
public ImageListServiceOutput getData() {
if (position < mData.size()) {
return mData.get(position);
}
return null;
}
public void onPhotoClicked(ImageListServiceOutput data) {
if (mImageClickedListener != null) {
if (data != null) {
Logger.info("Photo Clicked");
mImageClickedListener.onImageClicked(data, position);
} else {
Logger.info("Add Photo Clicked");
mImageClickedListener.onAddImageClicked(position);
}
}
}
};
return view;
}
公共片段getItem(最终int位置){
PhotoThumbnailFragment视图=新的PhotoThumbnailFragment(){
@凌驾
公共ImageListServiceOutput getData(){
如果(位置
PhotoThumbnailFragmentAdapter是一个独立的类。看起来您还没有为
PhotoThumbnailFragmentAdapter
定义空构造函数。
片段应该有一个空构造函数,如public PhotoThumbnailFragmentAdapter(){
//empty constructor
}
无法发表评论,因此作为答案张贴,请通过此链接,这可能会有所帮助 还有这个
PhotoPreviewFragment
class a公开和静态类。
现在,您的PhotoPreviewFragmentAdapter
是一个非静态(即它有一个封闭类,在您的例子中是PhotoPreviewFragmentAdapter
类)内部类,不能公开实例化PhotoPreviewFragment(){……}
将您的
PhotoPreviewFragment
重构为一个适当的公共静态内部类,或者只是在其自己的Java文件中重构为一个公共类。确保添加一个公共空构造函数。必须在fragmentadapter中放置一个空构造函数吗?谢谢我一直在测试,但你的为我工作谢谢谢谢你发布你的
PhotoThumbnailFragmentAdapter
代码?我编辑了我的问题..你使用了一个不知名的PhotoPreviewFragment。您不应该使用注释性片段类。将其更改为非注释性类。如果您应该访问mData
,可以通过实现mData
(1)的setter方法来访问它。我的片段不是一个内部类。它是一个独立的java类(一个.java文件)(2)。我添加了一个空构造函数,但仍然得到了相同的错误。在原始问题的代码示例中,您的片段是一个内部类。它的非公共(/匿名)类名是“PhotoThumbnailFragmentAdapter$1”,结尾的“$1”暗示它是一个非公共类,从代码中可以清楚地看出它是一个内部非公共类。嗯,我已经编辑了我的问题,你能看一下吗?也许你能给我一些建议如何解决这个问题。所以我这里有两个java文件,PhotoThumbnailFragment.java和PhotoThumbnailFragmentAdapter.java,但是您将PhotoThumbnailFragment子类化为一个新的内部匿名子类:“view=new PhotoThumbnailFragment(){……}”;您需要创建一个新的PhotoThumbnailFragment静态公共子类来替代这两个方法(getData和OnPhotoclick)。