【问题标题】:Unable to instantiate fragment make sure class name exists无法实例化片段确保类名存在
【发布时间】:2015-08-31 15:29:15
【问题描述】:

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: 无法开始活动 组件信息{com.paad.todolist/com.paad.todolist.ToDoListActivity}: android.view.InflateException:二进制 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/Android 运行时(836):在 android.app.ActivityThread.main(ActivityThread.java:4424) 06-16 03:04:14.091: E/AndroidRuntime(836): 在 java.lang.reflect.Method.invokeNative(Native Method) 06-16 03:04:14.091: E/AndroidRuntime(836): 在 java.lang.reflect.Method.invoke(Method.java:511) 06-16 03:04:14.091: E/Android 运行时(836):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 06-16 03:04:14.091: E/AndroidRuntime(836): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 06-16 03:04:14.091: E/AndroidRuntime(836): 在 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): 在 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): 在 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:无法实例化 fragment 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): 在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 06-16 03:04:14.091: E/AndroidRuntime(836): 在 java.lang.ClassLoader.loadClass(ClassLoader.java:501) 06-16 03:04:14.091: E/AndroidRuntime(836): 在 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 更多

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    发现,你logcat说明一切

     Caused by: java.lang.ClassNotFoundException: com.paad.todoList.ToDoListFragment
    

    您的包名不正确。使用 com.paad.todolist 而不是 com.paad.todoList

    这篇文章让我想起了电视节目的对话,夏洛克:你看到了,但你没有观察到 :) :)

    【讨论】:

    • 啊,是的!那个小错误让我很痛苦!我坐在那里看着你的回答,“嗯,那些完全一样......”有一段时间。下次我会多关注 LogCat。感谢您的帮助,以及不错的报价。
    【解决方案2】:

    TL;DR:

    如果您最近迁移了文件或进行了任何形式的复制和粘贴,请检查您的所有文件是否具有更新的包名称。

    全文:

    我创建了一个新模块,然后从另一个模块复制并粘贴了整个 javares 目录,之后我删除了旧模块。为了避免任何可能的冲突,我检查了所有 Kotlin/Java 文件并重命名了包名以反映文件现在所属的新包的名称。这就是我的意思:

    发件人:

    com.myapp.oldmodule.presentation.thisfile

    收件人:

    com.myapp.newmodule.presentation.thisfile

    通常,这应该可以解决任何潜在问题。 我的错误是我也忘记更新导航图文件;它仍然有包含旧/已删除模块的引用。

    【讨论】:

      【解决方案3】:

      有许多来自 Google 和其他人的教程/项目。我认为您现在的主要问题是调用者无法创建片段的新实例。 一个好的谷歌网页是@Fragments

      网页中的代码 sn-p:

      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 ListFragment,而不是 extends Fragment
      • 注意方法newInstance()。这将替换 new 关键字。

      【讨论】:

        【解决方案4】:

        对我来说,使用 AndroidStudio 的重构功能移动 XxxFragment.kt 文件后会出现此错误。

        检查引用 Fragment 的每个位置以查找原因很重要。重构未涵盖某些位置。您可以在使用XxxFragment 的全局搜索(按Shift 两次)时找到所有地点。

        在我的例子中,有两个地方没有自动重构:

        • nav_graph.xml 中的片段的android:name
        • tools:context 导入 fragment_xxx.xml 文件本身。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多