在Android中创建首选项活动

时间:2012-07-30 01:52:33

标签: java android

我尝试按照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进行开发,并且它显示所有@引用都得到满足。为什么这个单一标签会崩溃整个应用程序?

3 个答案:

答案 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,清除了已安装的应用程序的数据,并解决了这个问题。