我想验证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
(警告对话框)。
我无法真正理解如何以正确的方式验证。
答案 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)。您可以选择允许/禁止空值。 (最初接受的值无效。)