Android AutoCompleteTextView:如何确保输入的值来自提供的建议?

时间:2014-04-17 05:30:37

标签: android autocompletetextview

我期待在我的一个应用程序中使用AutoCompleteTextView。我正在努力!我正在为此视图设置值列表,并且有超过300个值。我想要实现的不是将它放在微调器中并滚动到所有可用值并选择一个,我希望用户输入文本并根据值来过滤。我还想确保输入的值来自可用的300个值。

我计划继续,当用户在此字段中输入值时,当他进入下一个字段时,我将使用这300个可用值验证该值!但我觉得这是一个耗时的方法。

如果有一种有效的方法可以帮助我吗?

更新

final AutoCompleteTextView actv=(AutoCompleteTextView)findViewById(R.id.textHint);

    final String[] assets=getResources().getStringArray(R.array.assets);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>
               (this,android.R.layout.simple_list_item_1,assets);
    actv.setAdapter(adapter);
    actv.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
            if(!actv.isPerformingCompletion())
            {
                boolean validator=false;
                for(String val :  assets )
                {
                    if(val.toLowerCase().startsWith(s.toString().toLowerCase()))
                    {
                    //  Toast.makeText(MainActivity.this, "No matches found ",  Toast.LENGTH_LONG).show();
                        validator=true;
                    }
                }

                if(!validator)
                {
                    //Toast.makeText(MainActivity.this, "No matches found ",  Toast.LENGTH_LONG).show();
                AlertDialog.Builder dialog=new AlertDialog.Builder(MainActivity.this);
                dialog.setMessage("No item Found!!");
                dialog.create();
                dialog.show();

                actv.setText("");
                }
            }

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    });

2 个答案:

答案 0 :(得分:0)

从这个开始。 http://developer.android.com/reference/android/widget/AutoCompleteTextView.html

    public class CountriesActivity extends Activity implements TextWatcher{
         protected void onCreate(Bundle icicle) {
             super.onCreate(icicle);
             setContentView(R.layout.countries);

             ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                     android.R.layout.simple_dropdown_item_1line, COUNTRIES);
             AutoCompleteTextView textView = (AutoCompleteTextView)
                     findViewById(R.id.countries_list);
             textView.setAdapter(adapter);
         }

         private static final String[] COUNTRIES = new String[] {
             "Belgium", "France", "Italy", "Germany", "Spain"
         };
@Override
    public void afterTextChanged(Editable s) {
        if(!COUNTRIES.contains(s.toString();
textView.setText("");
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // TODO Auto-generated method stub

    }
     }

答案 1 :(得分:0)

请问谷歌。找到here的快速示例。

大多数示例使用strings.xml中的静态值填充列表。而不是从strings.xml填充,修改适配器以从您拥有的任何东西追加,可能是一个数组。

关于问题的第二部分,验证用户是否从列表中输入值:(1)如果在文本框中输入了非列表值,则自动完成列表将不会显示任何内容。 (2)如果用户输入非列表值并单击“输入”键,则可以自行进行验证。

ed = (EditText) findViewById(R.id.quickSearch);
ed.setImeActionLabel("Search",EditorInfo.IME_ACTION_SEARCH);
ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId,
            KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                   // do your validation here