列表选项偏好设置中的异常问题

21

这是我的第一个Android应用程序,在尝试使用ListPreference时遇到了异常。应用程序与偏好一起加载...但当我触摸ListPreference条目时,应用程序会“意外停止”。

Settings.java

public class Settings extends PreferenceActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.addPreferencesFromResource(R.layout.settings);
    }
}

settings.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="chk_enabled"
        android:summary="SMS response based on settings"
        android:title="Enable"
    />
    <ListPreference
        android:title="Contacts"
        android:summary="Contacs that will be sent SMSs"
        android:key="list_contacts"
        android:defaultValue="0"
        android:entries="@array/list_entries"
        android:entryValues="@array/list_values" 
    />
</PreferenceScreen>

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="list_entries">
        <item>All</item>
        <item>WhiteList</item>
        <item>BlackList</item>
    </string-array>

    <integer-array name="list_values">
        <item>0</item>
        <item>1</item>
        <item>2</item>
    </integer-array>
</resources>

这是logcat输出:

D/AndroidRuntime( 3187): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
D/AndroidRuntime( 3187): CheckJNI is OFF
D/AndroidRuntime( 3187): --- registering native functions ---
I/jdwp    ( 3187): received file descriptor 16 from ADB
/ddm-heap( 3187): Got feature list request
I/ActivityManager(   86): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=tml.UI.main/.MainActivity }
D/AndroidRuntime( 3187): Shutting down VM
D/dalvikvm( 3187): DestroyJavaVM waiting for non-daemon threads to exit
I/ActivityManager(   86): Start proc tml.UI.main for activity tml.UI.main/.MainActivity: pid=3194 uid=10039 gids={1015}
D/dalvikvm( 3187): DestroyJavaVM shutting VM down
D/dalvikvm( 3187): HeapWorker thread shutting down
D/dalvikvm( 3187): HeapWorker thread has shut down
D/jdwp    ( 3187): JDWP shutting down net...
D/jdwp    ( 3187): +++ peer disconnected
I/dalvikvm( 3187): Debugger has detached; object registry had 1 entries
D/dalvikvm( 3187): VM cleaning up
D/dalvikvm( 3187): LinearAlloc 0x0 used 676380 of 4194304 (16%)
I/jdwp    ( 3194): received file descriptor 10 from ADB
D/ddm-heap( 3194): Got feature list request
W/Resources( 3194): Converting to string: TypedValue{t=0x10/d=0x0 a=-1}
I/ActivityManager(   86): Displayed activity tml.UI.main/.MainActivity: 977 ms (total 977 ms)
D/AndroidRuntime( 3194): Shutting down VM
W/dalvikvm( 3194): threadid=3: thread exiting with uncaught exception (group=0x4001da28)
E/AndroidRuntime( 3194): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 3194): java.lang.NullPointerException
E/AndroidRuntime( 3194):    at android.preference.ListPreference.findIndexOfValue(ListPreference.java:169)
E/AndroidRuntime( 3194):    at android.preference.ListPreference.getValueIndex(ListPreference.java:178)
E/AndroidRuntime( 3194):    at android.preference.ListPreference.onPrepareDialogBuilder(ListPreference.java:190)
E/AndroidRuntime( 3194):    at android.preference.DialogPreference.showDialog(DialogPreference.java:291)
E/AndroidRuntime( 3194):    at android.preference.DialogPreference.onClick(DialogPreference.java:262)
E/AndroidRuntime( 3194):    at android.preference.Preference.performClick(Preference.java:811)
E/AndroidRuntime( 3194):    at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:190)
E/AndroidRuntime( 3194):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
E/AndroidRuntime( 3194):    at android.widget.ListView.performItemClick(ListView.java:3246)
E/AndroidRuntime( 3194):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1635)
E/AndroidRuntime( 3194):    at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 3194):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 3194):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 3194):    at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 3194):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3194):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 3194):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 3194):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 3194):    at dalvik.system.NativeStart.main(Native Method)
I/Process (   86): Sending signal. PID: 3194 SIG: 3
I/dalvikvm( 3194): threadid=7: reacting to signal 3
I/dalvikvm( 3194): Wrote stack trace to '/data/anr/traces.txt'
I/Process ( 3194): Sending signal. PID: 3194 SIG: 9
I/ActivityManager(   86): Process tml.UI.main (pid 3194) has died.
I/WindowManager(   86): WIN DEATH: Window{4341fd00 tml.UI.main/tml.UI.main.MainActivity paused=false}
W/UsageStats(   86): Unexpected resume of com.android.launcher while already resumed in tml.UI.main
W/InputManagerService(   86): Got RemoteException sending setActive(false) notification to pid 3194 uid 10039

请发布LogCat信息。这将有助于我们所有人解决异常问题。 - Mohit Deshpande
我看到logcat是一个adb命令,但我不知道如何使用它...你能告诉我吗? - PedroC88
你是在使用Eclipse ADT吗?还是命令行工具? - Mohit Deshpande
我正在使用Eclipse ADT。我刚刚将logcat粘贴到问题中...我从“AndroidRuntime START”开始,并忽略了应用程序启动之前的所有消息。 - PedroC88
2个回答

49

我修复了它...我一直在尝试,最后发现我不能使用整数数组作为entryValues源。 我只是将整数数组更改为字符串数组,然后让它正常工作。

如果有一种方法可以使用整数数组作为entryValues的源,请评论说明。


有没有人注意到这在Android 2.3中运行良好,但在4.0+中会出现错误? - JPM
8
严重的是,自2009年以来没有人解决这个问题! - lixonn

1

我一直在寻找与您所需相似的解决方案,同意您应该能够使用整数数组来读取和存储整数结果。

我发现了一个解决这个问题的方法,可以在http://kvance.livejournal.com/1039349.html中找到,我认为它很有用。

它并没有完全按照我想象的方式或者您想要的方式来解决问题,而是仍然使用字符串数组来指定初始/选择值,尽管当ListPreference将其保存回SharedPreferences时,它会将其保存为整数而不是字符串(在用户选择时进行转换),从而消除了在访问首选项值时可能需要多次进行转换的需要。


所引用的代码远非完整解决方案,需要覆盖其他父方法(包括构造函数)以防止异常。 - Stan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接