How to limit EditTextPreference to range 1024: 65535
I have an EditTextPreference defined as:
<EditTextPreference
android:defaultValue="8888"
android:key="someKey"
android:title="SomeString"
android:inputType="number"
>
EditTextPreference internally uses EditText which can be accessed with EditTextPreference.getEditText()
.
I would like to limit the number that the user can enter in the range of integers from 1024 to 65535. How can I do this?
I have tried using both InputFilter and TextWatcher with no success.
Any ideas?
As you might have guessed, I am trying to check the input of the network port. Maybe I should use some other way to do this?
source to share
You can do it with EditText, but it would be much easier to use NumberPicker .
It has predefined methods for what you want: setMinValue (int) , setMaxValue (int) .
For inspiration:
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);
}
}
}
source to share
I answer this myself because I didn't want any other answers.
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;
}
}
});
This way you show a toast when the user enters an invalid number and does not save the entered value. This works for me and is easier than the usual NumberPicker preference which I was unable to follow.
source to share
You can use your own 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);
}
}
Here is a complete example application using it:
The port number will be stored as an integer.
source to share
The complete answer is here.
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;
}
}
});
}
In your settings, find the onPrerenceChange method and paste in the code block I provided above. This works for me.
source to share