Android,AutoCompleteTextView,强制从条目列表中删除文本
有没有办法强制autocompletetextview中的条目成为entrylist中的元素之一Android,AutoCompleteTextView,强制从条目列表中删除文本,android,validation,autocompletetextview,Android,Validation,Autocompletetextview,有没有办法强制autocompletetextview中的条目成为entrylist中的元素之一 我找到了一个名为“performValidation”的方法,但我不确定它的实际功能,而且我还没有找到太多的文档或示例。自动完成文本视图有一个名为setValidator()的方法,该方法将接口的一个实例AutoCompleteTextView.Validator作为参数AutoCompleteTextView.Validator包含isValid(),您可以使用它检查输入的值,并且可以通过实现fi
我找到了一个名为“performValidation”的方法,但我不确定它的实际功能,而且我还没有找到太多的文档或示例。自动完成文本视图有一个名为
setValidator()
的方法,该方法将接口的一个实例AutoCompleteTextView.Validator
作为参数AutoCompleteTextView.Validator
包含isValid()
,您可以使用它检查输入的值,并且可以通过实现fixText()
来“修复”此字符串
这似乎是使用AutoCompleteTextView
可以获得的最好结果,因为AutoCompleteTextView.Validator
的文档说明了以下内容:
“既然没有万无一失的方法
防止用户离开此服务器
视图中的值不正确,
我们所能做的就是设法解决它
当这种情况发生时,我们自己。”
如果元素列表不太长,则最好使用微调器
*******编辑:*********
我为您准备了一个如何使用此功能的快速示例,希望对您有所帮助
<?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>
-
公共类AutoCompleteTextViewActivity扩展活动{
String[]validWords=新字符串[]{“,”滑雪板“,”雪橇“,”障碍“};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AutoCompleteTextView视图=(AutoCompleteTextView)findViewById(R.id.input);
view.setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_下拉列表_项目_1line,validWords));
view.setValidator(newvalidator());
view.setOnFocusChangeListener(新的FocusListener());
}
类验证器实现AutoCompleteTextView.Validator{
@凌驾
公共布尔值isValid(字符序列文本){
Log.v(“测试”,“检查是否有效:”+文本);
Arrays.sort(validWords);
if(Arrays.binarySearch(validWords,text.toString())>0){
返回true;
}
返回false;
}
@凌驾
公共CharSequence fixText(CharSequence invalidText){
Log.v(“测试”,“返回固定文本”);
/*我只是在这里返回一个空字符串,所以字段将被清空,
*但是你可以在这里做任何动作,比如弹出对话框?
*
*在这里返回的值必须在有效单词列表中。
*/
返回“”;
}
}
类FocusListener实现View.OnFocusChangeListener{
@凌驾
public void onFocusChange(视图v,布尔hasFocus){
Log.v(“测试”,“焦点改变”);
if(v.getId()==R.id.input&&!hasFocus){
Log.v(“测试”、“执行验证”);
((AutoCompleteTextView)v).性能验证();
}
}
}
}
另一种替代方式(注释内联提及):
AutoCompleteTextView txt\u site\u name=findviewbyd(R.id.some\u auto\u text);
//获取国家/地区的字符串数组
String[]countries=getResources().getStringArray(R.array.ncr\u parking\u list\u array);
//创建适配器并将其设置为AutoCompleteTextView
ArrayAdapter=新的ArrayAdapter(getActivity(),android.R.layout.simple\u下拉列表\u项目\u 1行,国家/地区);
//txt_site_name是自动完成文本视图的名称。或自动完成文本视图txt\u站点\u名称
txt_site_name.setAdapter(适配器);
txt\u site\u name.setValidator(新的AutoCompleteTextView.Validator(){
@凌驾
公共布尔值isValid(字符序列文本){
//这里的一些逻辑根据文本是否经过验证返回true或false
if(text==“这就是我想要的”)
返回true;
其他的
返回false;
}
@凌驾
公共CharSequence fixText(CharSequence invalidText){
//如果.isValid()返回false,则代码将显示在这里
//按照您希望的方式修复用户输入并返回它
return“这就是我想要的”
}
});
参考资料:谢谢。最初我用的是旋转器,但我的用户抱怨说,所以我想我把它改成了ACTV。你有没有参考过使用验证器的例子?我正在努力实现。我给你们举了一个小例子,问问你们是否还有不清楚的地方!很好的例子。。一个明显的改进是,尽管每次调用isValid,但不必对单词进行排序。。可能会保留一个排序的标记即使输入的文本是数组中的文本,Soe上也应该有一个捐赠按钮AutoComplete textview在失去焦点后变为空白。当它再次获得焦点时,它将最后一个选定的项目作为预填充的文本。奇怪的事情发生了:/
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();
}
}
}
}
AutoCompleteTextView txt_site_name = findViewById(R.id.some_auto_text);
// Get the string array for the countries
String[] countries = getResources().getStringArray(R.array.ncr_parking_list_array);
// Create the adapter and set it to the AutoCompleteTextView
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_dropdown_item_1line, countries);
// txt_site_name is name of the AutoComplete text view. or AutoCompleteTextView txt_site_name
txt_site_name.setAdapter(adapter);
txt_site_name.setValidator(new AutoCompleteTextView.Validator() {
@Override
public boolean isValid (CharSequence text){
//some logic here returns true or false based on if the text is validated
if(text == "This is what I want")
return true;
else
return false;
}
@Override
public CharSequence fixText (CharSequence invalidText){
//If .isValid() returns false then the code comes here
//do whatever way you want to fix in the users input and return it
return "This is what I want"
}
});