web-dev-qa-db-ja.com

PreferenceActivity:値を整数として保存

私の設定アクティビティで単純なEditTextPreferenceを使用する:

<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を作成する方法は?

49
Laimoncijus

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"
/>
65
broot

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);
}

その後、コードから非常に簡単に使用できます。

7
broot

回答が受け入れられたとしても、これを達成するためのもう1つの短い方法を共有したいと思います。

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" />
4
Arnab Jain

私は同じ問題を抱えていました。 (SharedPreferenceに、defaultValueとして設定xmlファイルに保存されているポート番号を提供してほしい)。

すべてのSharedPreferencesメソッドを実装するのは非常に手間がかかるため、 broot が推奨するように、SharedPreferencesをインスタンス化したクラスにカスタムメソッドを記述するのが最善だと思います。

必要な行でIntegerのStaticメソッドを使用することもできます。

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

これは私が思いつく最短のものだと思う:

int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));
1
Jadeye