首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PreferenceFragment的片段$InstantiationException

PreferenceFragment的片段$InstantiationException
EN

Stack Overflow用户
提问于 2012-05-17 23:40:18
回答 3查看 2.1K关注 0票数 1

这对我来说是个谜。我不知道如何调试这种情况:

我遇到的问题是在"PreferenceFragment“类中。我开发了一个带有首选项头的经典“设置”界面:

代码语言:javascript
复制
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
<header 
    android:fragment="debut.telebox.Config$PrefSystemeFragment"
    android:icon="@drawable/ic_action_prefsysteme"
    android:title="Paramètres Système"
    android:summary="Paramètres système"
    />
<header 
    android:fragment="debut.telebox.Config$PrefChainesFragment"
    android:icon="@drawable/ic_action_preffavoris"
    android:title="Paramètres pour les chaînes"
    android:summary="Favoris"
    />
<header 
    android:fragment="debut.telebox.Config$PrefAproposFragment"
    android:icon="@drawable/icon"
    android:title="A propos"
    android:summary="A propos de TeleBox"
    />

PreferenceActivity为:

代码语言:javascript
复制
public class Config extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
}

@Override
public void onDestroy() {
    super.onDestroy();
    ...
}

@Override
public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.layout.prefentete, target);
    }

public static class PrefSystemeFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
}

当我在使用Eclipse的测试设备(Xoom和Android 4.0.4下的Nexus S)上直接运行这个应用程序时,我没有任何问题:我能够读写参数。

但是当我导出应用程序,然后在设备上运行它时,我得到了运行时错误:

代码语言:javascript
复制
05-17 17:30:12.680: E/AndroidRuntime(6391):     at dalvik.system.NativeStart.main(Native Method)
05-17 17:30:12.680: E/AndroidRuntime(6391): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment debut.telebox.Config$PrefSystemeFragment: make sure class name exists, is public, and has an empty constructor that is public
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.Fragment.instantiate(Fragment.java:581)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1117)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1150)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:551)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at debut.telebox.Config.onCreate(Unknown Source)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.Activity.performCreate(Activity.java:4465)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-17 17:30:12.680: E/AndroidRuntime(6391):     ... 11 more
05-17 17:30:12.680: E/AndroidRuntime(6391): Caused by: java.lang.ClassNotFoundException: debut.telebox.Config$PrefSystemeFragment
05-17 17:30:12.680: E/AndroidRuntime(6391):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.Fragment.instantiate(Fragment.java:571)
05-17 17:30:12.680: E/AndroidRuntime(6391):     ... 18 more
05-17 17:30:12.680: W/ActivityManager(161):   Force finishing activity debut.telebox/.Config
05-17 17:30:12.690: W/ActivityManager(161):   Force finishing activity debut.telebox/.TeleBox

不幸的是,我在Google Play上上传了我的应用程序,却没有看到它不工作……

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-18 00:39:28

如果它在调试模式下工作,而不是在导出时工作,那么ProGuard可能已经破坏了您的类名。将以下行添加到项目中的proguard-project.txt文件中:

代码语言:javascript
复制
-keep class debut.telebox.** { *; }

看看这有没有帮助。

如果没有,只需将您的PreferenceFragment类移动到单独的公共Java类中,而不是使用静态内部类,看看这是否有帮助。

票数 6
EN

Stack Overflow用户

发布于 2013-01-10 12:17:13

我用-keep class android.support.v4.** { *; }修复了它

票数 0
EN

Stack Overflow用户

发布于 2014-01-19 12:34:50

因为我不能添加注释,所以我想在CommonsWare answer中添加我注意到当java文件中没有引用类时会发生这种情况,因为Proguard的默认行为是为了空间优化而删除未引用的类。

我遇到了与OP的原始问题完全相同的问题--使用头文件将我的PreferenceActivity与PreferenceFragment的自定义扩展进行接口,在签名构建时进行调试和ClassNotFoundException。显然,ADT生成的源代码没有考虑到android:fragment引用(但话又说回来,我自8月13日以来就没有更新过ADT)

有效的解决方案正是CommonsWare所建议的:

代码语言:javascript
复制
-keep problematicpackage.** { *; }

"problematicpackage“是我声明自定义片段的包。** { *;}表达式包含其在-keep“指令”中的所有内容。

但是有一件事需要注意:使用这个“指令”,你可能不会得到这个包的混淆,压缩,或者优化的。我真的不太关心元包装或超级版权保护,因为我不会因为一些应该失败的东西而失眠,但如果你需要这样的功能,我建议你仔细阅读Proguard手册。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10638927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档