Android, Autocomplettextview, force text to be from the entry list

前端 未结 2 652
星月不相逢
星月不相逢 2020-12-24 03:39

Is there a way to force the entry in an autocompletetextview to be one of the elements in the entrylist?

I\'ve found a method called \"performValidation\" but im not

2条回答
  •  暖寄归人
    2020-12-24 04:12

    The AutoCompleteTextView has a method called setValidator() that takes an instance of the interface AutoCompleteTextView.Validator as parameter. AutoCompleteTextView.Validator contains isValid() with which you can check the value that has been entered, and you can "fix" this string by implementing fixText().

    Seems this is the best you can get with AutoCompleteTextView, as the documentation for AutoCompleteTextView.Validator states the following:

    "Since there is no foolproof way to prevent the user from leaving this View with an incorrect value in it, all we can do is try to fix it ourselves when this happens."

    If your list of elements is not too long, you are probably better off using a Spinner.

    ****** Edit: ******

    I wipped together a quick example of how you can use this, hope it helps!

    
    
    
    
    
    

    -

    public class AutoCompleteTextViewActivity extends Activity {
    
        String[] validWords = new String[]{"", "snowboard", "bobsleigh", "slalom"};
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            AutoCompleteTextView view = (AutoCompleteTextView)findViewById(R.id.input);
            view.setAdapter(new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, validWords));
            view.setValidator(new Validator());
            view.setOnFocusChangeListener(new FocusListener());
        }
    
        class Validator implements AutoCompleteTextView.Validator {
    
            @Override
            public boolean isValid(CharSequence text) {
                Log.v("Test", "Checking if valid: "+ text);
                Arrays.sort(validWords);
                if (Arrays.binarySearch(validWords, text.toString()) > 0) {
                    return true;
                }
    
                return false;
            }
    
            @Override
            public CharSequence fixText(CharSequence invalidText) {
                Log.v("Test", "Returning fixed text");
    
                /* I'm just returning an empty string here, so the field will be blanked,
                 * but you could put any kind of action here, like popping up a dialog?
                 * 
                 * Whatever value you return here must be in the list of valid words.
                 */
                return "";
            }
        }
    
        class FocusListener implements View.OnFocusChangeListener {
    
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                Log.v("Test", "Focus changed");
                if (v.getId() == R.id.input && !hasFocus) {
                    Log.v("Test", "Performing validation");
                    ((AutoCompleteTextView)v).performValidation();
                }
            }
        }
    }
    

提交回复
热议问题