How to limit EditTextPreference to a range 1024:65535

人盡茶涼 提交于 2020-01-02 07:06:43

问题


I have a EditTextPreference defined as:

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

EditTextPreference uses an EditText internally which can be obtained with EditTextPreference.getEditText().

I would like to limit the number the user can input to a range of integers between 1024 and 65535. How can I do that?

I tried to use both an InputFilter and a TextWatcher without success.

Any ideas?

As you might have guessed I am trying to validate inputting a network port. Maybe I should use some other kind of input for this?


回答1:


You can do this using a EditText, but it would be much easier using a 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);
        }
    }

}



回答2:


I am answering this myself because no other answers were what I wanted.

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 do not save the entered value. This works for me and is simpler than the custom NumberPicker preference which I was unable to make work.




回答3:


You could use my custom 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 app using it:

The port number will be saved as an integer.




回答4:


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 settingsactivity, look for onPrerenceChange method and insert the block of code that I have given above. It works for me.



来源:https://stackoverflow.com/questions/25166068/how-to-limit-edittextpreference-to-a-range-102465535

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!