我尝试按照docs创建一个简单的偏好设置活动屏幕。我按下选项菜单按钮时将其设置为启动,但是当我触发它时,我的应用程序崩溃,我得到这个无用的运行时异常消息:
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>
我分别在res / values / array.xml和res / values / array_values.xml中定义了units_choices和units_values,这些只是:
<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>
如果我注释掉ListPreference标记,首选项屏幕会显示并且我的应用不会崩溃,所以我假设ListPreference配置不正确。我究竟做错了什么?我正在使用Eclipse IDE进行开发,并且它显示所有@引用都得到满足。为什么这个单一标签会崩溃整个应用程序?
答案 0 :(得分:0)
这不是答案,但对评论来说有点大。
我认为myapp.ApplicationPreferenceActivity.onCreate(ApplicationPreferenceActivity.java:71)
是您调用setContentView()的ApplicationPreferenceActivity的行?因此它是一个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。
答案 1 :(得分:0)
1。首先,我看到ClassCastException
,当您尝试将错误类型的对象推入UN-Compatible类型的对象引用变量时,会发生这种情况。由于你没有把代码放在这里,我无法检测到它。
2。当您正在了解偏好活动时,我建议您查看此链接
http://androidresearch.wordpress.com/2012/03/09/creating-a-preference-activity-in-android/
答案 2 :(得分:0)
问题是由我在我的活动的onCreate中使用putInt设置默认的unit
首选项引起的,而units_values
显然被解释为字符串,即使它们也是整数。当ListPreference试图将我的默认int加载为字符串时,会抛出ClassCastException。
我在onCreate中修改了我的代码以使用putString,清除了已安装的应用程序的数据,并解决了这个问题。