51

シンプルな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デフォルトで値を整数として保存するにはどうすればよいですか?

4

6 に答える 6

71

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"
/>
于 2010-09-20T21:22:11.157 に答える
6

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

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

于 2010-09-15T22:16:32.257 に答える
3

Even though an Answer has been parked accepted I would like to share one more shorter way to achieve this :

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

Since you have already set that only numbers can be entered this won't through any exception. yet to complete my answer :

<EditTextPref
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2" />
于 2016-01-18T10:25:08.093 に答える
0

私は同じ問題を抱えていました。(SharedPreference で、設定 xml ファイルに defaultValue として保存したポート番号を取得したかったのです)。

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

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

int number = Integer.valueOf(settings.getString("myNumberString", "0"));
于 2016-01-18T09:58:03.317 に答える
0

これは私が思いつくことができる最短のものだと思います:

int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));
于 2019-03-16T09:12:58.337 に答える