У AutoCompleteTextView
есть метод с именем setValidator()
, который принимает экземпляр интерфейса AutoCompleteTextView.Validator
в качестве параметра.AutoCompleteTextView.Validator
содержит isValid()
, с помощью которого вы можете проверить введенное значение, и вы можете "исправить" эту строку путем реализации fixText()
.
Кажется, это лучшее, что вы можете получить с AutoCompleteTextView
, поскольку документация для AutoCompleteTextView.Validator
гласит следующее:
"Поскольку нет надежного способа предотвратить выход пользователя из этого представления с неверным значением, все, что мы можем сделать, это попробоватьчтобы исправить это самостоятельно, когда это произойдет. "
Если ваш список элементов не слишком длинный, вам, вероятно, лучше использовать Spinner.
****** Редактировать: ******
Я подготовил краткий пример того, как вы можете использовать это, надеюсь, это поможет!
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<AutoCompleteTextView
android:id="@+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Focus me to validate above text"/>
</LinearLayout>
-
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<String>(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();
}
}
}
}