2012-02-19 22 views
2

EditTextPreferenceの値が特定のintの範囲内にあることを検証したいとします(1から22と言うことができます)。検証できる唯一の部分は、inputType(数字のみ)で、prefs.xmlファイルに次のxml宣言が含まれていました。特定のint範囲のEditTextPreference値を検証する方法

アンドロイド:inputTypeは=「数」

私は2つ目はListSettings活動に次のコードを記述することです。

public class ListSettings extends PreferenceActivity implements OnSharedPreferenceChangeListener{ 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.prefs); 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    sp.registerOnSharedPreferenceChangeListener(this); 
} 
public void onSharedPreferenceChanged(SharedPreferences sp, String key) { 
     String value = sp.getString(key, null); 
     int intZoomValue = Integer.parseInt(value); 
     if (intZoomValue < 1 || intZoomValue > 22) { 
      Intent intent = new Intent().setClass(this, dialog.class); 
      // I want to call the dialog activity here... 
     } 

    } 

とdialog.classは以下の通りです:私が達成したい何

public class dialog extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("Please enter a value between 1-22!"); 
    builder.setCancelable(true); 

    AlertDialog alert = builder.create(); 
    alert.show(); 
    } 
} 

は、ユーザーがない範囲1に値を入力するたびdialog.class(警告ダイアログボックス)を呼び出すことです-22。

私は本当に正しい方法で検証する方法を理解できません。

答えて

0

無効な値が入力された場合は、許可された範囲に値をクランプし、行ったトーストでユーザーに通知するほうが、ユーザーフレンドリーな場合があります。

範囲が1-22など小さい場合は、EditTextの代わりにSpinnerを使用して、最初に無効な値を入力することもできます。

+0

[設定]メニューでスピナーを使用できるかどうかわかりません。トーストはユーザーに無効な入力を知らせるために正常に機能しましたが、値を許容範囲にクランプする方法はわかりません。私はそれに取り組んでいます。 – sotoz

0

setPositivteButtonを使用して、ユーザーがOKを押すと入力を検証することができます。正しくない場合は、ダイアログを再作成してください。

2

これは私がやったことです:

pref.getEditText() 

を、あなたは、フィルタを設定することができます。

EditTextPreference pref = (EditTextPreference) findPreference(this.getString(R.string.my_setting_key)); 
    pref.getEditText().setFilters(new InputFilter[]{ 
      new InputFilter(){ 

       @Override 
       public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
        try { 
         int input = Integer.parseInt(dest.toString() + source.toString()); 
         if (input<MAX_VALUE && input >0) 
          return null; 
        } catch (NumberFormatException nfe) { }  
        return ""; 
       } 
      } 
    }); 

だから、トリックは、あなたが使用してEditTextPreferenceから取得してのEditTextことができるということです。フィルタは、すべてが正常であればnullを返し、ユーザが入力したcharがテキストを無効にする場合は空文字列を返します。

here

0

がInputFilterソリューションは、特にselectAllOnFocusと、動作しませんを参照してください。

public static void setNumberRange(final EditTextPreference preference, 
            final Number min, final Number max) { 
    setNumberRange(preference, min, max, false); 
} 

public static void setNumberRange(final EditTextPreference preference, 
            final Number min, final Number max, 
            final boolean allowEmpty) { 

    preference.getEditText().addTextChangedListener(new TextWatcher() { 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
     } 

     @Override 
     public void afterTextChanged(final Editable s) { 

      Dialog dialog = preference.getDialog(); 
      if (dialog instanceof AlertDialog) { 
       Button button = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE); 
       if (allowEmpty && s.length() == 0) { 
        button.setEnabled(true); 
        return; 
       } 
       try { 
        if (min instanceof Integer || max instanceof Integer) { 
         int input = Integer.parseInt(s.toString()); 
         button.setEnabled((min == null || input >= min.intValue()) && (max == null || input <= max.intValue())); 
        } else if (min instanceof Float || max instanceof Float) { 
         float input = Float.parseFloat(s.toString()); 
         button.setEnabled((min == null || input >= min.floatValue()) && (max == null || input <= max.floatValue())); 
        } else if (min instanceof Double || max instanceof Double) { 
         double input = Double.parseDouble(s.toString()); 
         button.setEnabled((min == null || input >= min.doubleValue()) && (max == null || input <= max.doubleValue())); 
        } 
       } catch (Exception e) { 
        button.setEnabled(false); 
       } 
      } 
     } 
    }); 
} 

これはあなたのことができます:あなたが提案しピッカー/スピナーの代替を使用することができない場合は、最小値ではなく、最大値を強制したい場合に値がこのような無効な場合、たとえば、あなたはOKボタンを無効にすることができます最小値または最大値をInteger、FloatまたはDouble(無制限の場合はnullを渡す)として指定します。オプションで、空の値を許可/禁止できます。 (初期値は無効です)

関連する問題