2010-09-15 17 views
49

用我的喜好的活動簡單EditTextPreferencePreferenceActivity:保存值作爲整數

<EditTextPreference 
    android:key="SomeKey" 
    android:title="@string/some_title" 
    android:summary="..." 
    android:numeric="integer" 
    android:maxLength="2" 
/> 

有沒有一種辦法,這配置值將被保存爲整數?似乎現在它只是允許輸入數字,但該值仍然保存爲字符串:

呼叫:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
int value = preferences.getInt("SomeKey", -1); 

拋出我java.lang.ClassCastException: java.lang.String和:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
String value = preferences.getString("SomeKey", "-1"); 

成功地檢索值。

如何使PreferenceActivity默認保存爲整數值?

回答

58

你可以擴展EditTextPreference:

public class IntEditTextPreference extends EditTextPreference { 

    public IntEditTextPreference(Context context) { 
     super(context); 
    } 

    public IntEditTextPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected String getPersistedString(String defaultReturnValue) { 
     return String.valueOf(getPersistedInt(-1)); 
    } 

    @Override 
    protected boolean persistString(String value) { 
     return persistInt(Integer.valueOf(value)); 
    } 
} 

這將是更好的覆蓋onSetInitialValue()和的setText()方法,但你必須從一個基類複製一些代碼。上面的解決方案是簡單的,但它非常棘手 - 「字符串」方法用int整理。儘量不要通過擴展這個類進一步;-)

你可以使用它從XML:

<package.name.IntEditTextPreference 
    android:key="SomeKey" 
    android:title="@string/some_title" 
    android:summary="..." 
    android:numeric="integer" 
    android:maxLength="2" 
/> 
+0

@Brutall,我想通過改進代碼向您表示感謝。但有人對我說新代碼太長了,他拒絕了。噢,但是如果舊的代碼不好,人們會做什麼,需要更換,但是他們不這樣做,因爲新的代碼很長?即使它更好。哦,我的,這太棒了!這是程序員的地方嗎?我有一些開源項目,我打開了對我的代碼的任何更改。他多麼羞愧!無論如何,非常感謝Brutall。 – 2012-02-15 06:01:28

+0

順便說一句,我所做的是:將輸入類型設置爲數字;添加一個'TextWatcher',確保文本用戶輸入的內容不爲空,默認值爲'0'。 – 2012-02-15 06:04:50

+3

即時得到一個運行時錯誤返回String.valueOf(getPersistedInt(-1));',由於該行 – ibaguio 2013-01-09 18:02:14

7

即使您設置了android:numeric =「integer」,它也會是文本首選項 - 正如名稱所示。您可以使用Integer.valueOf()將字符串值輕鬆轉換爲int。 您也可以覆蓋PreferenceActivity在退出時自動執行轉換。


我認爲最好的辦法是寫簡單的方法來擺脫喜好這個值。例如:

public static int getSomePref(Context context) { 
    SharedPreferences prefs = 
     PreferenceManager.getDefaultSharedPreferences(context); 
    String value = prefs.getString("SomeKey", null); 
    return value == null ? -1 : Integer.valueOf(value); 
} 

然後,您可以很容易地從您的代碼中使用它。

+0

我在哪裏可以重寫這個?默認情況下'PreferenceActivity'會自動保存,我應該重寫一些獲取值的方法,或者全部保存自己嗎? – Laimoncijus 2010-09-16 08:43:34

+0

好吧,更改首選項的類型並不好,因爲您可能會遇到ClassCastException問題。我已經更新了我的答案。 – broot 2010-09-16 10:37:15

+0

是的,我想過自己的包裝,但有些時候我仍然不喜歡這個解決方案......'SharedPreferences'已經有'getInt'方法,所以仍然希望找到一種方法來告訴'PreferenceActivity'來保存值作爲int - 所有的功能都在那裏...只是沒有工作,因爲... – Laimoncijus 2010-09-20 18:45:43

0

我有同樣的問題。 (我想SharedPreference給我一個端口號,我將它作爲defaultValue存儲在首選項xml文件中)。

實現所有的SharedPreferences方法將會花費很多精力,所以在實例化SharedPreferences的類中編寫自定義方法,建議如下broot將是我認爲最好的。

您可以藏漢只使用整型的靜態方法在該行你需要它:

int number = Integer.valueOf(settings.getString("myNumberString", "0")); 
3

即使一個答案已經停接受我想和大家分享一個更短的方式來實現這一目標:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
int value = Integer.parseInt(preferences.getString("SomeKey", "-1")); 

由於您已經設定只能輸入數字,所以不會發生任何異常。 還沒有完成我的答案:

<EditTextPref 
    android:key="SomeKey" 
    android:title="@string/some_title" 
    android:summary="..." 
    android:numeric="integer" 
    android:maxLength="2" />