我将EditTextPreference定义为:
<EditTextPreference
android:defaultValue="8888"
android:key="someKey"
android:title="SomeString"
android:inputType="number"
>
EditTextPreference在内部使用EditText,可以使用EditTextPreference.getEditText()
获取。
我想限制用户可以输入1024到65535之间整数范围的数字。我该怎么做?
我尝试使用InputFilter和TextWatcher但没有成功。
有什么想法吗?
您可能已经猜到我正在尝试验证输入网络端口。也许我应该为此使用其他类型的输入?
答案 0 :(得分:6)
我自己回答这个问题,因为没有其他答案是我想要的。
final int minPort = 1024;
final int maxPort = 2048;
final EditTextPreference editTextPreference = (EditTextPreference)findPreferenceByResId(R.string.pref_telnet_server_port_key);
editTextPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
int val = Integer.parseInt(newValue.toString());
if ((val > minPort) && (val < maxPort)) {
Log.d(LOGTAG, "Value saved: " + val);
return true;
}
else {
// invalid you can show invalid message
Toast.makeText(getApplicationContext(), "error text", Toast.LENGTH_LONG).show();
return false;
}
}
});
这样,当用户输入无效数字并且不保存输入的值时,您将显示祝酒词。这对我有用,并且比我无法工作的自定义NumberPicker首选项更简单。
答案 1 :(得分:3)
您可以使用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);
}
}
}
答案 2 :(得分:0)
您可以使用我的自定义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);
}
}
以下是a complete example app使用它:
端口号将保存为整数。
答案 3 :(得分:0)
完整的答案就在这里。
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;
}
}
});
}
在您的settingsactivity中,查找onPrerenceChange方法并插入我上面给出的代码块。它对我有用。