【问题标题】:How to handle Android onSharedPreferenceChanged without nested IF ELSE statement如何在没有嵌套 IF ELSE 语句的情况下处理 Android onSharedPreferenceChanged
【发布时间】:2012-07-06 10:25:34
【问题描述】:

我有一个 Activity 为我的 Shared Preferences 实现了一个监听器,所以当用户拉起 FragmentPrefs 并更改一个值 onSharedPreferenceChanged(SharedPreferences prefs, String key) 时,很好。

SharedPreferences prefs;
OnSharedPreferenceChangeListener listener;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    registerPreferenceListener();
}

private void registerPreferenceListener()
{
    listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

    Debug.out("LISTENING! - Pref changed for: " + key + " pref: " +
    prefs.getString(key, null) );
      }
    };

    prefs.registerOnSharedPreferenceChangeListener(listener);
}

问题是我正在尝试找到一种方法来优雅地处理更改首选项的事件,而不会在代码中产生难闻的气味。

我有很多需要管理的首选项,因此嵌套的 IF ELSE 语句会变得冗长乏味。我考虑过实现多态性,这会很好,但我仍然需要一个 if/else 来决定调用哪个类的实现。

开关可能会更好,因为我可以引用 R.string.pref_name,尽管 changedPref 方法使用字符串作为键标识符。

是我把事情复杂化了,还是我错过了一些琐碎的事情?

谢谢。

【问题讨论】:

    标签: android if-statement


    【解决方案1】:

    它不是嵌套的 IF-ELSE。当您需要评估 String 参数时,它只是一个普通的 IF-ELSE 结构。没有错。其他任何事情都绝对过于复杂。

    if (key.equals(PREFS_KEY_A)) {
        ...
    } else if (key.equals(PREFS_KEY_B)) {
        ...
    } else if (key.equals(PREFS_KEY_C)) {
        ...
    }
    

    【讨论】:

    • 这是我采用的方法,但是它是嵌套的 IF ELSE 因为您首先需要找出偏好是什么,然后是执行正确功能的偏好值。感谢您的确认。
    【解决方案2】:

    if/else 没什么问题。我不确定你能逃脱它。毕竟,您需要检查即将到来的项目。多态性可能看起来更好,但请记住,在 Android 中创建对象比在桌面上更昂贵。所以有时为了性能,丑陋的代码是值得的(注意:除非你可以使用静态方法并避免使用新方法)。

    【讨论】:

    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多