【问题标题】:Can't access preferences created by PreferenceActivity无法访问 PreferenceActivity 创建的首选项
【发布时间】:2011-03-30 16:17:52
【问题描述】:

我有一个最小的程序,它只是让我使用 Android 的 PreferenceActivity 设置两个首选项(一个 int 和一个 String)。所以我有一个定义我的偏好的 xml 文件,以及一个扩展 PreferenceActivity 的活动。我的主要活动有一个选项菜单,可以启动我的偏好活动。所有这些都很好。我可以设置我的偏好,并且在我的程序执行期间和之后保留这些值。

现在,在我的主要活动中,我想检索这些偏好。应该很容易吧?这是我见过的每个示例的代码:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
int intSetting = prefs.getInt("intSetting", 0);
String strSetting = prefs.getString("strSetting", "");

问题是,如果我在 getInt() 调用中中断并跳过,我的堆栈看起来像这样,如果我继续,应用程序将崩溃:

线程 [ main](已暂停)
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, 意图)线路:2494
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, 意图)线路:2512
ActivityThread.access$2200(ActivityThread, ActivityThread$ActivityRecord, Intent) 线路:119
ActivityThread$H.handleMessage(消息) 线路:1863
ActivityThread$H(Handler).dispatchMessage(Message) 行:99 Looper.loop() 行:123
ActivityThread.main(String[]) 行: 第4363章 对象[],类,类[],类,整数, boolean) 行:不可用 [native 方法] Method.invoke(对象, 对象...) 行:521
ZygoteInit$MethodAndArgsCaller.run() 行:860 ZygoteInit.main(String[]) 行:618 NativeStart.main(String[]) 行:不可用[本机方法]

我尝试了传递给 getDefaultSharedPreferences() 的参数的变体,包括:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

...可能还有其他一些在不同的上下文中(即,当从我的主要活动、另一个活动和非活动类中的某些函数访问首选项时。结果总是相同的。

我在网上阅读了十几篇来自其他人的问答帖子,他们通过编写与我相同的代码解决了这个问题,所以我不希望有解决方案,但如果有人有任何想法,请告诉我。

【问题讨论】:

    标签: android android-sdk-2.1 sharedpreferences preferenceactivity


    【解决方案1】:

    只是为了确保:

    • 在你的AndroidManifest 中,你应该拥有扩展PreferenceActivityActivity,如下所示:

    • 扩展PreferenceActivityActivity 应具有以下代码:

      @覆盖 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.layout.prefs); }

    R.layout.prefs 是您偏好的 xml。

    如果您已经完成了这两件事,请使用您正在使用的 xml 编辑您的问题,以便 ppl 可以重现您的问题。

    【讨论】:

    • 我已经说过我可以设置和保存首选项,如果没有此代码,我将无法做到这一点。所以不是这样。
    【解决方案2】:

    您没有显示堆栈跟踪。 Thread [<3> main] (Suspended) 是 Eclipse 的无用输出。您需要检查真正的堆栈跟踪,您应该允许 Android 继续“强制关闭”对话框,然后查看 LogCat(从您的 DDMS 角度来看)堆栈跟踪。

    我的猜测是您有一个名为intSetting 的首选项,但它不是整数,但这只是猜测。即兴发挥,我想不出任何内置的 Preference 类会存储整数首选项,因为它们主要存储字符串。

    您访问默认SharedPreferences(使用this)的方式是正确的,不需要更改。

    Here is a sample project 展示了PreferenceActivity 的使用并返回了SharedPreferences

    【讨论】:

    • 这就是问题所在。 PreferenceActivity 创建首选项的方式不允许我创建一个 int 设置,所以这应该是一个线索。令人失望的是,我没有收到任何有意义的信息。我被指定一个数字键盘在文本字段中输入数据的能力愚弄了。这让我认为它被存储为一个整数,即使它显然不是。
    【解决方案3】:

    它不会崩溃,即使你的偏好没有被保存,我认为你错过了一些代码并且崩溃不是来自这一点。你还有其他话题吗?

    【讨论】:

    • 它确实崩溃了,提供的代码是它崩溃的位置和原因。
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多