2012-07-06 53 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