5

私はその数をEditTextPreference0から9までの数でなければなりません。他の文字を防ぐことはできますが、バックスペースを防ぐことはできません。Backspace +Okay=空の値。空の値は、値が取得されて数値に解析されるとクラッシュすることを意味します。

現時点では、プリファレンスがいつ変更されるか、特定のキーがあり長さがないかどうかを確認し、変更される場合は「0」で再保存します。これを行うためのより簡単な組み込みの方法はありますか?「requirevalue」プロパティ、または少なくともdigits、変更された設定を取得できるようにするなど、より自動化されたものですか?(数字が「0123456789」の場合、空であってはなりません)。

これまでの設定アクティビティでは、次のようになっています。

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    //Prevent EditText from being non number
    String type = this.findPreference(key).getClass().getSimpleName();
    if( type.equals("EditTextPreference")
        //Put key of any allowed to be blank here...
                && prefs.getString(key, "0").length()==0 ){ 
            this.findPreference(key).setSummary("0");

        SharedPreferences.Editor prefedit = prefs.edit();
        prefedit.putString(key, "0");
        prefedit.commit();
    }
    updateSummaries();
}

(セットサマリーが機能していません-^。プロパティを確認できると、android:digits="0123456789"プロパティを確認できるので、空白にする必要のあるキーを入力する必要がありません。)

または、メインアクティビティで、すべての数値設定を文字列に入れ、文字列をチェックし、適切でない場合は0に設定してから、各文字列を解析できます。私がそれらをより多く使用するにつれて、これは自動的ではなく、あまり魅力的ではないと感じます。

String sTT = prefs.getString("mykey", "0");
>> x10
if(sTT.length()==0){ sTT="0"; }
>> x10
tt = Long.parseLong( sTT );
>> x10, different types

(これはまだ最善の方法かもしれません...?)

4

4 に答える 4

1

の基になるTextWatcherに を適用できます。これにより、テキストへの変更を傍受し、任意の方法で変更することができます。たとえば、デフォルトの数字 ( ) を強制的に含めることができます。EditTextPreferenceEditText0

ただし、データを解析するときに空の入力に対処する方が全体的には理にかなっていると思います。

于 2012-11-21T15:11:05.227 に答える
0

本当に簡単な方法は、このように EditTextPreference を単純にオーバーライドすることです。

public class SafeEditTextPreference extends EditTextPreference {

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public SafeEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public SafeEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

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


    @Override
    protected void onDialogClosed(boolean positiveResult) {
        boolean valid = this.getEditText().getText().toString().length() > 0;
        super.onDialogClosed(valid);
    }

}

次に、EditTextPreference の代わりにそれを使用します。テキスト文字列が少なくとも1つ長い場合にのみ設定に保存されますが、その有効性チェックを必要なものに変更できます.

TextWatcher を追加して、ユーザーにより動的な応答を与えることができます。

于 2016-10-15T10:45:48.727 に答える
0

EditText を使用する単純な設定クラスをいつでも作成できます。android:inputType = "number"

于 2012-11-21T15:11:11.170 に答える