【问题标题】:Android Preferences error, "String cannot be cast to int"Android 首选项错误,“字符串无法转换为 int”
【发布时间】:2013-07-24 13:10:14
【问题描述】:

我正在尝试设置首选项活动,但我的应用不断崩溃,并且我得到以下 logcat:

致命异常:主要 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.appthing.myapp/com.appthing.myapp.Main}: java.lang.ClassCastException:java.lang.String 不能转换为 java.lang.Integer

原因:java.lang.ClassCastException:java.lang.String 不能 转换为 java.lang.Integer 07-24 16:37:59.556: E/AndroidRuntime(17384): 在 android.app.SharedPreferencesImpl.getInt(SharedPreferencesImpl.java:240)

在我的Main 活动中,onResume() 方法中有以下代码:

    SeekBar tipSeekBar = (SeekBar) findViewById(R.id.tipSeekBar);
    SeekBar splitSeekBar = (SeekBar) findViewById(R.id.splitSeekBar);

    SharedPreferences preferences = PreferenceManager
            .getDefaultSharedPreferences(this);

    tipSeekBar.setProgress(preferences.getInt("defaultTip", 15));
    splitSeekBar.setProgress(preferences.getInt("defaultSplit", 1));
    tipSeekBar.setMax(preferences.getInt("maxTip", 25));
    splitSeekBar.setMax(preferences.getInt("maxSplit", 10));

这是我在 Preference 类中的内容(根据要求):

addPreferencesFromResource(R.layout.preferences);
// I was told in tutorials this is all I need in the oncreate method

我不明白为什么它会说一些关于字符串的东西。我所有的值都是整数,我使用android:inputType="number" 来确保只能输入一个 int。我还尝试卸载并重新安装该应用程序以清除缓存,但没有任何效果。

已解决:

“您在 XML 中的首选项,即使您设置了 android:inputType="number" 仍然存储为字符串”Waza_Be)。 我所要做的就是做Integer.parseInt() 来获取正确的值。

【问题讨论】:

  • 你能看到调用 getInt 失败的哪一行的堆栈跟踪吗?是tipSeekBar还是splitSeekBar等
  • 你能发布你如何存储偏好中的值吗?
  • 是的,我已经更新了我的帖子。
  • 代码中的哪一行抛出了这个异常?

标签: java android string integer sharedpreferences


【解决方案1】:

如果您使用正确的数据类型存储首选项,那么这应该不是问题。请查看 JavaDoc here

【讨论】:

    【解决方案2】:

    您在 XML 中的首选项,即使您设置了 android:inputType="number",仍然存储为字符串

    你有两个选择:

    1) “不太好”:Integer.parseInt( preferences.getString("defaultTip", "15"));

    2) 使用您自己的 Integer Preference 类型。首先设置起来更复杂,但确实更好(类似问题:https://stackoverflow.com/a/3755608/327402

    【讨论】:

    • "您在 XML 中的首选项,即使您设置了 android:inputType="number" 仍然存储为字符串" 这是关键,我从来不知道这一点!谢谢!
    • 很高兴我能帮上忙。
    • 嗯,这很愚蠢。特别是当您的 ListPreferences 引用 时,它仍然将它们视为字符串。感谢您的提示。
    • 我在整数对象的共享首选项中设置了字符串值“”,所以当我从首选项中获取值时,我遇到了这个问题,所以请确保你设置的首选项中的值只是整数。
    • 好的,这是我第二次遇到这种情况,相隔多年,我仍然要问 - preferences.getIntpoint 是什么,如果它只是会抛出异常?!
    【解决方案3】:

    如果

    也可以抛出异常
    • 您正在使用相同的key 存储两种或多种不同类型的values
    • 最初您将值存储为String,然后更改了int 值的存储和检索实现。对于这种情况,只需清除缓存即可。

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 2014-12-22
      • 2019-02-26
      • 2021-08-21
      • 2020-12-12
      相关资源
      最近更新 更多