簡體   English   中英

無法實例化片段確保類名存在

[英]Unable to instantiate fragment make sure class name exists

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;
        }
    }

日志貓:

06-16 03:04:14.091: E/AndroidRuntime(836): 致命異常: main 06-16 03:04:14.091: E/AndroidRuntime(836): java.lang.RuntimeException: 無法啟動活動 ComponentInfo{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): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 06-16 03:04:14.091 : E/AndroidRuntime(836): at android.app.ActivityThread.access$600(ActivityThread.java:123) 06-16 03:04:14.091: E/AndroidRuntime(836): at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1147) 06-16 03:04:14.091: E/AndroidRuntime(836): at 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/AndroidRunt ime(836): at 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): 在 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): 在 com.android.internal。 policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 06-16 03:04:14.091: E/AndroidRuntime(836): at 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/AndroidRun time(836): ... 11 more 06-16 03:04:14.091: E/AndroidRuntime(836): 引起: android.app.Fragment$InstantiationException: 無法實例化片段 com.paad.todoList.ToDoListFragment: make確定類名存在,是公共的,並且有一個空的構造函數是公共的 06-16 03:04:14.091: E/AndroidRuntime(836): at 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): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673) 06-16 03:04:14.091: E /AndroidRuntime(836): ... 21 more 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 個

發現,你 logcat 說明了一切

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

您的軟件包名稱不正確。 使用com.paad.todolist而不是com.paad.todoList

這篇文章讓我想起了電視節目對話,夏洛克:你看到了,但你沒有觀察:) :)

特爾;博士:

如果您最近遷移了文件或進行了任何形式的復制和粘貼,請檢查您的所有文件是否都具有更新的包名稱。

完整故事:

我創建了一個新模塊,然后從另一個模塊復制並粘貼了整個javares目錄,然后我刪除了舊模塊。 為了避免任何可能的沖突,我檢查了所有 Kotlin/Java 文件並重命名包名稱以反映文件現在所屬的新包的名稱。 這就是我的意思:

從:

com.myapp.oldmodule.presentation.thisfile

到:

com.myapp.newmodule.presentation.thisfile

通常,這應該已經解決了任何潛在問題。 然而,我的錯誤是我也忘記更新導航圖文件 它仍然有包含舊/已刪除模塊的引用。

有很多來自 Google 和其他公司的教程/項目。 我認為您現在的主要問題是調用者無法創建 Fragment 的新實例 一個不錯的 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關鍵字。

對我來說,使用 AndroidStudio 的重構功能移動XxxFragment.kt文件后會發生此錯誤。

檢查引用 Fragment 的每個地方以找到原因很重要。 重構未涵蓋某些位置。 您可以在對XxxFragment使用全局搜索(按兩次Shift )時找到所有位置。

在我的情況下,有兩個地方沒有自動重構:

  • android:name nav_graph.xml片段的nav_graph.xml
  • tools:contextfragment_xxx.xml文件本身tools:context導入tools:context

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM