Android 如何将EditTextPreference限制在1024:65535的范围内

Android 如何将EditTextPreference限制在1024:65535的范围内,android,android-edittext,Android,Android Edittext,我的EditTextPreference定义为: <EditTextPreference android:defaultValue="8888" android:key="someKey" android:title="SomeString" android:inputType="number" > EditTextPreference在内部使用EditText,可通过EditTextPreference.getEditText()获得 我想将用户可以输入的数字限

我的EditTextPreference定义为:

<EditTextPreference 
android:defaultValue="8888" 
android:key="someKey" 
android:title="SomeString"
android:inputType="number"    
>

EditTextPreference在内部使用EditText,可通过
EditTextPreference.getEditText()
获得

我想将用户可以输入的数字限制在1024到65535之间的整数范围内。我该怎么做

我尝试使用InputFilter和TextWatcher,但都没有成功

有什么想法吗


正如您可能猜到的,我正在尝试验证输入的网络端口。也许我应该使用其他类型的输入来实现这一点?

您可以使用EditText来实现,但使用

它有预定义的方法来满足您的需要:

灵感来源:

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);
        }
    }

}

我自己回答这个问题,因为没有其他答案是我想要的

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;
            }
        }
    });
final int minPort=1024;
最终int maxPort=2048;
final EditTextPreference EditTextPreference=(EditTextPreference)findReferenceByResId(R.string.pref_telnet_server_port_key);
editTextPreference.setOnPreferenceChangeListener(新的OnPreferenceChangeListener(){
@凌驾
公共布尔onPreferenceChange(首选项首选项,对象newValue){
int val=Integer.parseInt(newValue.toString());
如果((val>minPort)&(val
这样,当用户输入无效数字且不保存输入的值时,将显示toast。这对我来说很有用,比我无法使用的自定义NumberPicker首选项更简单。

您可以使用我的自定义:

以下是如何使用它:


端口号将保存为整数。

完整答案在这里

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;
                    }
                }
            });

}
public boolean onPreferenceChange(首选项,对象值){
.
.
.
//其他默认项
.
.
.
EditTextPreference EditTextPreference=(EditTextPreference)FindReference(“someKey”);
editTextPreference.setOnPreferenceChangeListener(新的Preference.OnPreferenceChangeListener(){
@凌驾
公共布尔onPreferenceChange(首选项首选项,对象newValue){
int val=Integer.parseInt(newValue.toString());
如果((val>1024)和&(val<65355)){
Log.d(“首选项”,“保存的值:”+val);
首选项。设置摘要(“+val”);
返回true;
}
否则{
//无效您可以显示无效消息
Toast.makeText(getActivity(),“选择3到25之间的内容”,Toast.LENGTH_LONG.show();
返回false;
}
}
});
}

在您的settingsactivity中,查找onPrerenceChange方法并插入我上面给出的代码块。它适合我。

我会使用NumberPickerI,我曾经使用过EditTextPrefrence,并且我使用了return参数来保存或不保存值,但它会一直关闭。数字游戏可能比这更简单?从首选项屏幕使用NumberPicker没有简单的方法。我找到了com.lukehorvat.NumberPickerDialogPreference,但一旦添加android:key=“yourkey”,它就会崩溃。。到目前为止,我没有印象。请将内容添加到您的答案中,我会将其标记为一。:)最后,我使用了我在回答中编写的代码,但我可以看出您所做的是更好的—只是在本例中不是我想要的。检查newValue是否为空字符串或使用异常都可以防止它崩溃。:)我必须显式调用
getOnPreferenceChangeListener()以使其正常工作。
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;
                    }
                }
            });

}