android.app.Fragment $ InstantiationException:无法实例化片段:确保类名存在,是公共的,并且有一个公共的空构造函数。
我发现有很多关于相同错误的问题,但到目前为止没有人帮助过我。我正在从一本书中学习,并且实际上已经运行了确切的(99%肯定)代码。在删除所有内容并重写以供审阅之后,错误就出现了。
package com.paad.todolist;
import android.app.ListFragment;
import android.os.Bundle;
public class ToDoListFragment extends ListFragment{
public static ToDoListFragment newInstance(int index) {
ToDoListFragment f = new ToDoListFragment();
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
}
logcat的:
06-16 03:04:14.091:E / AndroidRuntime(836):致命异常:主要 06-16 03:04:14.091:E / AndroidRuntime(836):java.lang.RuntimeException:无法启动活动ComponentInfo {com.paad.todolist / com.paad.todolist.ToDoListActivity}:android.view.InflateException:Binary XML文件行#13:错误膨胀类片段 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.ActivityThread.access $ 600(ActivityThread.java:123) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1147) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.os.Handler.dispatchMessage(Handler.java:99) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.os.Looper.loop(Looper.java:137) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.ActivityThread.main(ActivityThread.java:4424) 06-16 03:04:14.091:E / AndroidRuntime(836):at java.lang.reflect.Method.invokeNative(Native Method) 06-16 03:04:14.091:E / AndroidRuntime(836):at java.lang.reflect.Method.invoke(Method.java:511) 06-16 03:04:14.091:E / AndroidRuntime(836):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784) 06-16 03:04:14.091:E / AndroidRuntime(836):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 06-16 03:04:14.091:E / AndroidRuntime(836):at dalvik.system.NativeStart.main(Native Method) 06-16 03:04:14.091:E / AndroidRuntime(836):引起:android.view.InflateException:二进制XML文件行#13:错误膨胀类片段 06-16 03:04:14.091:E / AndroidRuntime(836):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.view.LayoutInflater.inflate(LayoutInflater.java:489) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.view.LayoutInflater.inflate(LayoutInflater.java:396) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.view.LayoutInflater.inflate(LayoutInflater.java:352) 06-16 03:04:14.091:E / AndroidRuntime(836):at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.Activity.setContentView(Activity.java:1835) 06-16 03:04:14.091:E / AndroidRuntime(836):at com.paad.todolist.ToDoListActivity.onCreate(ToDoListActivity.java:18) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.Activity.performCreate(Activity.java:4466) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 06-16 03:04:14.091:E / AndroidRuntime(836):... 11更多 06-16 03:04:14.091:E / AndroidRuntime(836):引起:android.app.Fragment $ InstantiationException:无法实例化片段com.paad.todoList.ToDoListFragment:确保类名存在,是公共的,并且有一个公共的空构造函数 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.Fragment.instantiate(Fragment.java:585) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.Fragment.instantiate(Fragment.java:549) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.Activity.onCreateView(Activity.java:4235) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673) 06-16 03:04:14.091:E / AndroidRuntime(836):... 21更多 06-16 03:04:14.091:E / AndroidRuntime(836):引起:java.lang.ClassNotFoundException:com.paad.todoList.ToDoListFragment 06-16 03:04:14.091:E / AndroidRuntime(836):at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 06-16 03:04:14.091:E / AndroidRuntime(836):at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 06-16 03:04:14.091:E / AndroidRuntime(836):at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 06-16 03:04:14.091:E / AndroidRuntime(836):在android.app.Fragment.instantiate(Fragment.java:571) 06-16 03:04:14.091:E / AndroidRuntime(836):... 24更多
答案 0 :(得分:1)
TL; DR:
如果您最近迁移了文件或进行了任何形式的复制和粘贴,请检查所有文件的软件包名称是否已更新。
完整故事:
我创建了一个新模块,然后从另一个模块复制并粘贴了整个 java 和 res 目录,然后删除了旧模块。为避免任何可能的冲突,我检查了所有Kotlin / Java文件并重命名了程序包名称,以反映该文件现在所属的新程序包的名称。这就是我的意思:
发件人:
com.myapp.oldmodule.presentation.thisfile
收件人:
com.myapp.newmodule.presentation.thisfile
通常,这应该可以解决所有潜在问题。 但是我的错误是我也忘记了更新导航图文件;它仍然具有包含旧/已删除模块的引用。
答案 1 :(得分:0)
Google和其他人提供了许多教程/项目。我认为你现在的主要问题是调用者无法创建片段的新实例。 一个好的Google网页是@ Fragments。
网页上的代码段:
public static class DetailsFragment extends Fragment {
/**
* Create a new instance of DetailsFragment, initialized to
* show the text at 'index'.
*/
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
注意:
extends Fragment
,在您的情况下替换为extends ListFragment
。newInstance
()。这将取代new
关键字。答案 2 :(得分:0)
发现你,logcat说了一切
Caused by: java.lang.ClassNotFoundException: com.paad.todoList.ToDoListFragment
您的包裹名称不正确。使用 com.paad.todolist
代替 com.paad.todoList
这篇文章让我想起电视节目对话框, Sherlock:你看,但你没有观察 :):)