![](/img/trans.png)
[英]FORCE CLOSE: Unable to instantiate fragment make sure class name exists, is public, and has an empty constructor that is public
[英]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
這篇文章讓我想起了電視節目對話,夏洛克:你看到了,但你沒有觀察:) :)
特爾;博士:
如果您最近遷移了文件或進行了任何形式的復制和粘貼,請檢查您的所有文件是否都具有更新的包名稱。
完整故事:
我創建了一個新模塊,然后從另一個模塊復制並粘貼了整個java和res目錄,然后我刪除了舊模塊。 為了避免任何可能的沖突,我檢查了所有 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:context
在fragment_xxx.xml
文件本身tools:context
導入tools:context
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.