0

我正在尝试按照文档创建一个简单的首选项活动屏幕。我已经将它设置为在按下选项菜单按钮时启动,但是当我触发它时,我的应用程序崩溃并且我收到了这个无用的运行时异常消息:

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 进行开发,它表明所有 @ 引用都得到满足。为什么这个单一标签会使整个应用程序崩溃?

4

3 回答 3

0

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

我假设myapp.ApplicationPreferenceActivity.onCreate(ApplicationPreferenceActivity.java:71)是您调用 setContentView() 的 ApplicationPreferenceActivity 行?因此,这是一个 xml 膨胀错误。

关于您的 xml 文件的几件事。您无需致电:

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

就像文档中的示例一样。

另外,您使用的是什么 API 级别?您是否知道从 API 级别 11 开始,大部分 PreferenceActivity 类已被弃用,而现在它使用 PreferenceFragments 代替?因此,如果您想支持 Pre Android 3.0,您可以使用 PreferenceActivity,但是,如果您想支持 3.0 及更高版本,则必须使用PreferenceFragments

于 2012-07-30T02:43:52.490 回答
0

问题是由于我unit在我的活动的 onCreate 中使用 putInt 设置了默认首选项引起的,而units_values显然它们被解释为字符串,即使它们也是整数。当 ListPreference 尝试将我的默认 int 加载为字符串时,会引发 ClassCastException。

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

于 2012-07-30T14:41:07.950 回答
0

1.首先我看到一个ClassCastException,当您尝试将错误类型的对象推入 UN-Compatible 类型的对象引用变量时会发生这种情况。由于您没有在此处放置代码,因此我无法检测到它。

2.由于您现在正在学习 Preference Activity,我建议您查看此链接

http://androidresearch.wordpress.com/2012/03/09/creating-a-preference-activity-in-android/

于 2012-07-30T04:35:36.843 回答