EditText& TextChangeListener

时间:2012-06-05 15:36:11

标签: android android-edittext

我需要你的帮助。 我有EditText字段,它充当搜索字段,用于搜索列表中的许多项目。现在我使用TextWatcher的afterTextChanged(Editable s)方法,但它对我来说并不完美。快速输入和擦除后的某些时候,下一个搜索过程不涉及用户输入的所有文本。原因是在漫长的搜索过程中,我不能缩短它。在我的情况下,我需要知道,wnen用户完全输入他的输入,但afterTextChanged()处理每个符号更改。我会很感激任何想法。谢谢!

3 个答案:

答案 0 :(得分:8)

我猜你正在使用TextWatcher,因为你想进行实时搜索。在这种情况下,您无法知道用户何时完成输入,但您可以限制搜索的频率。

以下是一些示例代码:

searchInput.addTextChangedListener(new TextWatcher()
{
    Handler handler = new Handler();
    Runnable delayedAction = null;

    @Override
    public void onTextChanged( CharSequence s, int start, int before, int count)
    {}

    @Override
    public void beforeTextChanged( CharSequence s, int start, int count, int after)
    {}

    @Override
    public void afterTextChanged( final Editable s)
    {
        //cancel the previous search if any
        if (delayedAction != null)
        {
            handler.removeCallbacks(delayedAction);
        }

        //define a new search
        delayedAction = new Runnable()
        {
            @Override
            public void run()
            {
                //start your search
                startSearch(s.toString());
            }
        };

        //delay this new search by one second
        handler.postDelayed(delayedAction, 1000);
    }
});

了解输入是否已结束的唯一方法是用户按Enter键或搜索按钮等。您可以使用以下代码监听该事件:

searchInput.setOnEditorActionListener(new OnEditorActionListener()
{

    @Override
    public boolean onEditorAction( TextView v, int actionId, KeyEvent event)
    {
        switch (actionId)
        {
        case EditorInfo.IME_ACTION_SEARCH:
            //get the input string and start the search
            String searchString = v.getText().toString();
            startSearch(searchString);
            break;
        default:
            break;
        }
        return false;
    }
});

只需确保将android:imeOptions="actionSearch"添加到布局文件中的EditText

答案 1 :(得分:1)

答案 2 :(得分:0)

我通常如何使用onFocusChange

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            // Do your thing here
        }
    }
});

这有一个缺点,即用户不得不离开edittext字段,所以我不确定它是否适合你想要做的事情......