无法实例化片段,确保类名存在

时间:2015-06-16 00:17:59

标签: java android android-fragments

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更多

3 个答案:

答案 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:你看,但你没有观察 :):)