【问题标题】:Android: Obtain the int value of a preference keyAndroid:获取首选项键的int值
【发布时间】:2012-02-22 20:53:19
【问题描述】:

我想添加一个 OnSharedPreferenceChangeListener 并根据传入的键进行切换

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
switch(obtainIntFromKey(key)){
    case R.string.settings_some_propery : doSomething(); break;
    ...
}

obtainIntFromKey(key) 方法的外观如何?

【问题讨论】:

    标签: android key listener switch-statement sharedpreferences


    【解决方案1】:

    你可以用目前的方法来做:

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        int value = sharedPreferences.getInt(key, 0);
        switch(value){
        case R.string.settings_some_propery : doSomething(); break;
            ...
        }
    }
    

    【讨论】:

    • 嗯,这只是在模拟器和手机上崩溃了:FATAL EXCEPTION: main java.lang.ClassCastException: java.lang.Boolean at android.app.ContextImpl$SharedPreferencesImpl.getInt(ContextImpl.java:3057) at com.myapp.services.SchedulerService$1.onSharedPreferenceChanged(SchedulerService.java:174) at android.app.ContextImpl$SharedPreferencesImpl$EditorImpl.notifyListeners(ContextImpl.java:3270) at android.app.ContextImpl$SharedPreferencesImpl... 因为它似乎无法访问这行特定的源代码,所以我不知道根本原因是什么.. .
    • 我相信这不是我想要的。当我在寻找用于在 R 文件中编码该字符串的 int 值时,这个方法应该返回的是这个首选项应该具有的 int 值(可以说是一个实例)......如果我是,请纠正我得出错误的结论...
    【解决方案2】:

    您要切换的内容不正确。 OnSharedPreferenceChangeListener 将传递解析的键文字。不幸的是,您不能将 switch()..case 语句与它传递的键一起使用(除非您在 Java 7 上)。由于您的首选项屏幕的选项有限,并且您事先知道它们是什么,因此您检查那些您想要在更改时做出反应的键:

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){
        if(key.equals(getString(R.string.somestringresourceyoucareabout)) {
           //if you ask the user to enter an int value for this key then you need to cast it explicitly since preferences will store everything as text except for checkboxpreference
           int value = Integer.parseInt(prefs.getString(key, defaultValue));
        }
        else if(key.equals(getString(...)) {
           ...
        } 
    }
    

    如果您真的想使用 switch()..case,您可能需要研究使用 eclipse ADT 插件使用 Java 7。 坦率地说,如果您正在为每个在您希望访问的键中,您可以使用嵌套的 if..else if 条件代替并完成它,而不是花时间将 Java 7 与 ADT 一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      相关资源
      最近更新 更多