優先感性:値を整数として保存します
-
03-10-2019 - |
質問
シンプルを使用します 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
デフォルトで整数として値を節約するには?
解決
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"
/>
他のヒント
Android:numeric = "Integer"を設定しても、テキストの好みになります - その名前が示すように。 integer.valueof()を使用して、文字列値をintに簡単に変換できます。 また、Exitで自動的に変換を行うように優先電位を上書きすることもできます。
最良の解決策は、この価値を好みから得るための簡単な方法を書くことだと思います。何かのようなもの:
public static int getSomePref(Context context) {
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(context);
String value = prefs.getString("SomeKey", null);
return value == null ? -1 : Integer.valueOf(value);
}
その後、コードから非常に簡単に使用できます。
答えが駐車されているにもかかわらず、私はこれを達成するためのさらに短い方法を共有したいと思います:
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" />
同じ問題がありました。 (defaultValueとしてXMLファイルの設定に保存したポート番号を提供するために、SharedPreferenceが必要でした)。
すべてのSharedPreferencesメソッドを実装するのは大変な労力であるため、SharedPreferencesをインスタンスしたカスタムメソッドをクラスに書くと、 ブルート 提案されたのが最善だと思います。
必要なラインで整数の静的方法を使用することもできます。
int number = Integer.valueOf(settings.getString("myNumberString", "0"));
これは私が思いつくことができる最短のものだと思います:
int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));