1

我有一个 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 方法使用字符串作为键标识符。

我是不是把事情复杂化了,还是我错过了一些微不足道的事情?

谢谢。

4

2 回答 2

2

它不是嵌套的 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)) {
    ...
}
于 2012-07-06T10:44:26.153 回答
1

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

于 2012-07-06T10:42:19.250 回答