如何验证特定int范围的EditTextPreference值

时间:2012-02-19 23:45:52

标签: java android preference

我想验证EditTextPreference值是否在特定int范围内(比如说1到22)。我可以验证的唯一部分是inputType(仅限数字),在prefs.xml文件中包含以下xml声明。

  

android:inputType =“number”

我做的第二件事是在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-22范围内时调用dialog.class(警告对话框)。

我无法真正理解如何以正确的方式验证。

4 个答案:

答案 0 :(得分:2)

这就是我所做的:

    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:

    pref.getEditText()

然后你可以设置一个过滤器。当一切正常时,过滤器应返回null,而当用户输入的char将使文本无效时,返回空字符串。

另见here

答案 1 :(得分:0)

如果输入的值无效,将值限制在允许的范围内可能会更加用户友好,并通过Toast通知用户您已经这样做了。

如果您的范围很小,例如1-22,那么您甚至可以考虑使用Spinner代替EditText,这样用户就无法在第一时间输入无效值

答案 2 :(得分:0)

您可以使用setPositivteButton并在用户点击后验证输入。如果不正常,请重新启动对话框。

答案 3 :(得分: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);
                }
            }
        }
    });
}

这允许您将最小值和/或最大值指定为Integer,Float或Double(对于无界,传递null)。您可以选择允许/禁止空值。 (最初接受的值无效。)