EditText - 如何检测输入 3 个或更多字符并执行搜索

Posted

技术标签:

【中文标题】EditText - 如何检测输入 3 个或更多字符并执行搜索【英文标题】:EditText - How to detect typing 3 or more characters and perform search 【发布时间】:2021-08-29 05:11:56 【问题描述】:

需要帮助。已经4天没有任何反应。 尝试进行 SQLite 数据库搜索。 如何使列表视图不立即显示,而仅在用户输入搜索查询时显示? 也就是说,来自数据库的数据没有被过滤,但是当用户输入请求时,匹配项出现在列表视图中。 提前非常感谢大家!`

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    userFilter = findViewById(R.id.userFilter);
    listView = findViewById(R.id.listView);

    final DatabaseAccessSmeta databaseAccessSmeta = DatabaseAccessSmeta.getInstance(this);
    databaseAccessSmeta.open();
    List<String> quotes = databaseAccessSmeta.Search();
    databaseAccessSmeta.close();


    final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.region_list, quotes);
    this.listView.setAdapter(adapter);

    adapter.getFilter().filter(userFilter.getText().toString());

    userFilter.addTextChangedListener(new TextWatcher() 

        public void afterTextChanged(Editable s)  

        public void beforeTextChanged(CharSequence s, int start, int count, int after)  
        
        public void onTextChanged(CharSequence s, int start, int before, int count) 

            adapter.getFilter().filter(s.toString());
        
    );


` 

【问题讨论】:

那么,你想要的是:用户按下回车键后,搜索就会加载,对吧? 【参考方案1】:

如果您只想在用户按下回车键/搜索键后加载结果,则无需添加TextWatcher,只需添加EditorActionListener:

/* Adding action listener for handling search click */
userFilter.setOnEditorActionListener((v, actionId, event) -> 
    if (actionId == EditorInfo.IME_ACTION_SEARCH) 
        // Hiding keyboard
        userFilter.clearFocus();
        InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (in != null) 
            in.hideSoftInputFromWindow(userFilter.getWindowToken(), 0);
        
        // Initiate search
        adapter.getFilter().filter(userFilter.getText().toString());
        return true;
    
    return false;
);

同样在您的 xml 中,将 android:imeOptions="actionSearch" 添加到您的 EditText

编辑:

如果你想让它在输入 3 个字符后可见,那么你必须添加 TextWatcher:

userFilter.addTextChangedListener(new TextWatcher() 
    public void afterTextChanged(Editable s) 
        String query = (s != null) ? s.toString() : "";
        if (query.length() >= 3) 
            listView.setVisibility(View.VISIBLE);
            adapter.getFilter().filter(query);
         else 
            // Either set an empty list or change visibility
            listView.setVisibility(View.INVISIBLE);
            adapter.getFilter().filter("");
        
    
    public void beforeTextChanged(CharSequence s, int start, int count, int after)  
    public void onTextChanged(CharSequence s, int start, int before, int count)  
);

【讨论】:

非常感谢。如何进行实时搜索?以便选项实时出现在列表视图中?问题是列表立即显示,输入被过滤后。我需要列表不可见并在输入 3 个字母后出现。 对于该功能,您可以添加一个 TextWatcher,并在其 afterTextChanged() 中检查其长度是否 >= 3,并根据它设置您的列表视图可见/不可见。 谢谢。你帮了我很多。我想这就是我需要的。抱歉,您能否举一个代码示例。再次感谢!

以上是关于EditText - 如何检测输入 3 个或更多字符并执行搜索的主要内容,如果未能解决你的问题,请参考以下文章

将 iOS 中的 UIlabel 文本字段限制为两个字符,输入 3 个或更多时重置

如何使用颤动在按钮网格中滑动/拖动 2 个或更多按钮

如何在Android Studio中对包含数值的EditText字段执行基本计算

将子进程的标准输出重定向到 2 个或更多子进程的标准输入

EditText设置下划线提示字颜色输入字体颜色及问题

EditText设置下划线提示字颜色输入字体颜色及问题