我有一个EditTextPreference定义为:
<EditTextPreference
android:defaultValue="8888"
android:key="someKey"
android:title="SomeString"
android:inputType="number"
>
EditTextPreference在内部使用EditText,这可以通过EditTextPreference.getEditText()
获得。
我想把用户输入的数字限制在1024到65535之间的整数范围内。我怎么能这么做?
我试图同时使用InputFilter和TextWatcher,但没有成功。
有什么想法吗?
正如您可能已经猜到的,我正在尝试验证输入一个网络端口。也许我应该用其他类型的输入来解决这个问题?
发布于 2014-08-06 17:21:26
您可以使用EditText来完成这个任务,但是使用NumberPicker要容易得多。
它为您想要的东西定义了预定义的方法:setMinValue(int)、setMaxValue(int)。
寻找灵感:
import android.content.Context;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.NumberPicker;
/*
* Add this to your XML resource.
*/
public class NumberPickerPreference extends DialogPreference {
private NumberPicker numberPicker;
public NumberPickerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected View onCreateDialogView() {
return generateNumberPicker();
}
public NumberPicker generateNumberPicker() {
numberPicker = new NumberPicker(getContext());
numberPicker.setMinValue(1025);
numberPicker.setMaxValue(65535);
numberPicker.setValue(1025);
/*
* Anything else you want to add to this.
*/
return numberPicker;
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
int port = numberPicker.getValue();
Log.d("NumberPickerPreference", "NumberPickerValue : " + port);
}
}
}
发布于 2015-05-25 09:09:36
您可以使用我的自定义NumberPickerPreference.java
public class NumberPickerPreference extends DialogPreference {
private NumberPicker mPicker;
private int mNumber = 1024;
public NumberPickerPreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public NumberPickerPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setPositiveButtonText(android.R.string.ok);
setNegativeButtonText(android.R.string.cancel);
}
@Override
protected View onCreateDialogView() {
mPicker = new NumberPicker(getContext());
mPicker.setMinValue(1024);
mPicker.setMaxValue(2048);
mPicker.setValue(mNumber);
return mPicker;
}
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
mPicker.clearFocus();
setValue(mPicker.getValue());
}
}
@Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
setValue(restoreValue ? getPersistedInt(mNumber) : (Integer) defaultValue);
}
public void setValue(int value) {
if (shouldPersist()) {
persistInt(value);
}
if (value != mNumber) {
mNumber = value;
notifyChanged();
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getInt(index, 0);
}
}
下面是使用它的完整的示例应用程序:
端口号将作为整数保存。
发布于 2016-12-27 15:17:28
完整的答案在这里。
public boolean onPreferenceChange(Preference preference, Object value) {
.
.
.
//other default items
.
.
.
EditTextPreference editTextPreference=(EditTextPreference) findPreference("someKey");
editTextPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
int val = Integer.parseInt(newValue.toString());
if ((val > 1024) && (val < 65355)) {
Log.d("Preference ","Value saved: " + val);
preference.setSummary(""+val);
return true;
}
else {
// invalid you can show invalid message
Toast.makeText(getActivity(), "Choose something between 3 and 25", Toast.LENGTH_LONG).show();
return false;
}
}
});
}
在您的设置活动中,查找onPrerenceChange方法并插入我前面给出的代码块。对我来说很管用。
https://stackoverflow.com/questions/25166068
复制相似问题