2012-07-30 77 views
0

我正在尝试创建一个简单的首选项活动屏幕,以下是docs。我已经将其设置为一个选项菜单按钮被按下时启动,但是当我触发它,我的应用程序崩溃,我得到这个没用的运行时异常消息:在Android中创建首选项活动

07-29 21:42:28.879: E/AndroidRuntime(13441): FATAL EXCEPTION: main 
07-29 21:42:28.879: E/AndroidRuntime(13441): java.lang.RuntimeException: Unable to start activity ComponentInfo{myapp/myapp.ApplicationPreferenceActivity}: java.lang.ClassCastException: java.lang.Integer 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2737) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2753) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.app.ActivityThread.access$2500(ActivityThread.java:129) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2107) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.os.Looper.loop(Looper.java:143) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.app.ActivityThread.main(ActivityThread.java:4701) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at java.lang.reflect.Method.invokeNative(Native Method) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at java.lang.reflect.Method.invoke(Method.java:521) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at dalvik.system.NativeStart.main(Native Method) 
07-29 21:42:28.879: E/AndroidRuntime(13441): Caused by: java.lang.ClassCastException: java.lang.Integer 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.app.ContextImpl$SharedPreferencesImpl.getString(ContextImpl.java:2797) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.Preference.getPersistedString(Preference.java:1249) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.ListPreference.onSetInitialValue(ListPreference.java:232) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.Preference.dispatchSetInitialValue(Preference.java:1172) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at andr 
oid.preference.Preference.onAttachedToHierarchy(Preference.java:984) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:156) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:97) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:38) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.GenericInflater.rInflate(GenericInflater.java:488) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.GenericInflater.inflate(GenericInflater.java:326) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.GenericInflater.inflate(GenericInflater.java:263) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:251) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:262) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at myapp.ApplicationPreferenceActivity.onCreate(ApplicationPreferenceActivity.java:71) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-29 21:42:28.879: E/AndroidRuntime(13441): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2701) 
07-29 21:42:28.879: E/AndroidRuntime(13441): ... 11 more 

我的喜好配置文件很简单:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:title="@string/preferences_title" > 
    <ListPreference 
     android:defaultValue="1" 
     android:entries="@array/units_choices" 
     android:entryValues="@array/units_values" 
     android:key="units" 
     android:summary="@string/units_summary" 
     android:title="@string/units_title" /> 
</PreferenceScreen> 

我有units_choices和RES /价值/ array.xml定义units_values和RES /价值/ array_values.xml分别,这是简单的:

<resources 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <string-array 
     name="units_choices"> 
     <item>Imperial (miles)</item> 
     <item>Metric (meters)</item> 
    </string-array> 
</resources> 

<resources 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <string-array name="units_values" translatable="false"> 
     <item>2</item> 
     <item>1</item> 
    </string-array> 
</resources> 

如果我注释掉李stPreference标记,首选项屏幕显示和我的应用程序不会崩溃,所以我假设ListPreference配置不正确。我究竟做错了什么?我正在开发使用Eclipse IDE,它显示所有@引用都满意。为什么这个标签会崩溃整个应用程序?

回答

0

这不是一个答案,但对评论有点大。

我认为myapp.ApplicationPreferenceActivity.onCreate(ApplicationPreferenceActivity.java:71)是你的ApplicationPreferenceActivity的行,你调用setContentView()?因此这是一个XML膨胀错误。

一些关于你的xml文件的东西。你并不需要调用:

android:layout_width="match_parent" 
android:layout_height="match_parent" 

就像从docs的例子。

另外,您使用的是什么API级别?您是否知道,从API级别11中,PreferenceActivity类的大部分已被弃用,现在它使用PreferenceFragments?所以如果你想支持Pre Android 3.0,你可以使用PreferenceActivity,但是,如果你想支持3.0及以上,你将不得不使用PreferenceFragments

0

的问题是我的设置使用putInt在默认unit偏好引起的我的活动的onCreate,而units_values显然被解释为字符串,即使他们也是整数。当ListPreference尝试将我的默认int作为字符串加载时,抛出ClassCastException。

我在onCreate中修改了我的代码以使用putString,清除了我安装的应用程序的数据,并解决了问题。