2011-06-14 52 views
6

我試圖讓現有的首選項子類工作,保存顏色值。我沒有寫這個類,但它應該在android-7及更高版本上工作(我正在編譯爲android-9目標)。完整的源代碼是available here。這裏就是偏好保存:未保存Android自定義首選項值

@Override 
public void onColorChanged(int color) { 
    if (isPersistent()) { 
     boolean ret = persistInt(color); 
    } 
    // (update preview box, other stuff) 
} 

使用調試輸出,我可以告訴大家,isPersistent()回報true,但persistInt()回報false。根據Android documentationpersistInt()返回首選項是否持續;這些如何返回不同的值? (注意:setPersistent(true)是從構造函數明確調用的。)

在任何情況下,值都不會保存。對getPersistedInt(defaultValue)的調用返回默認值,甚至稍後在類的相同實例中返回。在下面的代碼中,getPersistedInt()始終被調用並始終返回mDefaultValue

public int getValue() { 
    try { 
     if (isPersistent()) { 
      mValue = getPersistedInt(mDefaultValue); 
     } 
    } catch (ClassCastException e) { 
     mValue = mDefaultValue; 
    } 

    return mValue; 
} 

這是爲什麼,我該如何確保首選項被保留?

+0

FWIW,這裏是我的了'ColorMixer'部件項目,還打包爲'ColorPreference':https://github.com/commonsguy/cwac-colormixer的鏈接 – CommonsWare 2011-06-14 22:52:59

+0

謝謝,我已經看過你的,但決定反對它,因爲雖然RGB滑塊可用於非觸摸屏手機,但我的應用程序無論如何都需要觸摸屏,而且我更喜歡某種HSL選擇器。 – tmandry 2011-06-15 03:47:07

回答

8

經過許多無望的搜索之後,我終於發現問題:由於我的首選項XML文件中存在簡單的拼寫錯誤,因此首選項值未分配給一個鍵。 (我用android.key代替android:key

由於Android試圖堅持說沒有密鑰的偏好時,不會向您發出警告(只是默默地失敗,而不是),你應該調用,而不是isPersistent()shouldPersist()函數試圖堅持之前一個值,如果shouldPersist()返回false,可能會記錄警告。例如:

@Override 
public void onColorChanged(int color) { 
    mValue = color; 
    if (shouldPersist()) { 
     persistInt(color); 
    } else { 
     if (isPersistent()) 
      Log.w("myapp", "shouldPersist() returned false. Check if this preference has a key."); 
    } 
    // (update preview box, other stuff) 
} 
+0

有同樣的問題花了幾小時,感謝 – Michal 2016-01-28 23:16:17

相關問題