无法实例化设置片段

时间:2012-12-20 20:11:56

标签: java android instantiation rom

我正在尝试将一个片段添加到Android设置应用中,以自定义我正在处理的ROM。这是我根据logcat强制关闭时得到的错误。

E/AndroidRuntime(31496): FATAL EXCEPTION: main
E/AndroidRuntime(31496): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.SubSettings}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.android.settings.pcf.RomSettings: make sure class name exists, is public, and has an empty constructor that is public
E/AndroidRuntime(31496):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
E/AndroidRuntime(31496):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2356)
E/AndroidRuntime(31496):    at android.app.ActivityThread.access$600(ActivityThread.java:150)
E/AndroidRuntime(31496):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
E/AndroidRuntime(31496):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(31496):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(31496):    at android.app.ActivityThread.main(ActivityThread.java:5193)
E/AndroidRuntime(31496):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(31496):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(31496):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
E/AndroidRuntime(31496):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
E/AndroidRuntime(31496):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(31496): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.android.settings.pcf.RomSettings: make sure class name exists, is public, and has an empty constructor that is public
E/AndroidRuntime(31496):    at android.app.Fragment.instantiate(Fragment.java:592)
E/AndroidRuntime(31496):    at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1138)
E/AndroidRuntime(31496):    at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1154)
E/AndroidRuntime(31496):    at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:539)
E/AndroidRuntime(31496):    at com.android.settings.Settings.onCreate(Settings.java:152)
E/AndroidRuntime(31496):    at android.app.Activity.performCreate(Activity.java:5104)
E/AndroidRuntime(31496):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
E/AndroidRuntime(31496):    at E/AndroidRuntime(31496):     ... 11 more
E/AndroidRuntime(31496): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.settings.pcf.RomSettings" on path: /system/app/Settings.apk
E/AndroidRuntime(31496):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
E/AndroidRuntime(31496):    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
E/AndroidRuntime(31496):    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
E/AndroidRuntime(31496):    at android.app.Fragment.instantiate(Fragment.java:582)
E/AndroidRuntime(31496):    ... 18 more

班级是公开的,一切都是。我确定这个名字是对的。这是我的Github链接,文件为:https://github.com/konstantinkeller/android_packages_apps_Settings/blob/jb4.2.1/src/com/android/settings/pcf/RomSettings.java

这就是整个包裹。您也可以检查XML和所有内容。谁能帮我?感谢。

3 个答案:

答案 0 :(得分:3)

我猜错误信息是正确的,你的班级不在apk中。尝试将您的文件/包添加到proguard.flags文件。

Proguard可能会删除该文件,如果它没有在您的代码中引用,而只是作为xml文件中的文本引用。

  

ProGuard是一个免费的Java类文件收缩器,优化器,混淆器和预处理器。 它会检测并删除未使用的类,字段,方法和属性。

答案 1 :(得分:0)

您需要为您的班级使用不同的路径。 com.android.settings是android系统的一部分。使用您拥有的域名。

答案 2 :(得分:0)

添加到kapep的答案,您应该知道一些前沿的Android功能有时会提供来自XML文件引用的错误的java引用生成,例如R.java中的ID和gen /中的其他来源。

当我使用xml / headers.xml来连接我的PreferenceActivity和自定义PreferenceFragments时,我发生了这种情况,“ android:fragment ”引用了后面的那些(ENTIRE项目中唯一的引用) 。 Proguard刚刚排除了它们,因为没有正确创建gen / * .java引用。 Android构建工具基本上使用Eclipse构建后保留的文件,并且这些文件不会包含“android:fragment”引用,因此检测到cstom类永远不会被OS在运行时使用,而proguard只是删除它们。 我认为ADT错误可能是这个糟糕的参考代的罪魁祸首。

长话短说 - 每当你想调试这个问题的根本原因时,在proguard配置上使用“-keep packagename。** {*;}”。如果它得到解决,你可以尝试更新ADT,清理项目以重新触发gen / creation,以及不使用-keep打包。如果仍然失败,只需离开-keep指令,再也不要考虑它。