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

我遇到的问题是在“ PreferenceFragment”类内部。我开发了带有首选项标题的经典“设置”界面:

<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为:

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在测试设备(Android 4.0.4下的Xoom和Nexus S)上直接运行此应用程序时,我没有问题:我能够读取和写入参数。

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

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上上传了我的应用程序,却没有看到它无法正常运行...

最佳答案

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

-keep class debut.telebox.** { *; }


看看是否有帮助。

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

07-28 01:30
查看更多