2012-07-06 51 views
1

我有一个活动为我的共享首选项实现了一个侦听器,因此当用户拉起FragmentPrefs并更改onSharedPreferenceChanged(SharedPreferences首选项,字符串键)的值时, 。如何在没有嵌套IF ELSE语句的情况下处理Android onSharedPreferenceChanged

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方法使用String作为密钥标识符。

我是否在复杂的事情,还是我错过这么琐碎?

谢谢。

回答

1

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

+0

谢谢,内存管理也很好。 – tutts 2012-07-06 10:56:07

+0

更多的信息在这里:http://developer.android.com/guide/practices/performance.html#object_creation – Ran 2012-07-06 11:05:00

2

它不是嵌套的IF-ELSE。这只是一个正常的IF-ELSE结构,当您需要评估一个String参数时使用。没有错。其他任何事情都是过分复杂的。

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

这是我采取的方法,但它是一个嵌套的IF ELSE,因为你首先需要找出偏好是,那么偏好值是什么来执行正确的功能。感谢您的确认。 – tutts 2012-07-06 10:55:52