Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 编辑文本及;TextChangeListener_Android_Android Edittext - Fatal编程技术网

Android 编辑文本及;TextChangeListener

Android 编辑文本及;TextChangeListener,android,android-edittext,Android,Android Edittext,我需要你的帮助。 我有EditText字段,它充当搜索字段,用于搜索列表中的许多项。现在我正在使用TextWatcher的PostTextChanged(Editable s)方法,但它并不适合我。有些时候,在快速输入和删除后,下一个搜索过程并不涉及用户输入的所有文本。原因是在漫长的搜索过程中,我不能把它缩短。在我的例子中,我需要知道,wnen用户根本不会结束他的输入,但PostTextChanged()会处理每个符号的更改。我会感激你的任何想法。谢谢 您需要的是TextWatcher 您需要的

我需要你的帮助。
我有EditText字段,它充当搜索字段,用于搜索列表中的许多项。现在我正在使用TextWatcher的PostTextChanged(Editable s)方法,但它并不适合我。有些时候,在快速输入和删除后,下一个搜索过程并不涉及用户输入的所有文本。原因是在漫长的搜索过程中,我不能把它缩短。在我的例子中,我需要知道,wnen用户根本不会结束他的输入,但PostTextChanged()会处理每个符号的更改。我会感激你的任何想法。谢谢

您需要的是TextWatcher


您需要的是TextWatcher


我猜您使用的是
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

我猜您使用的是
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

我通常的做法是使用
onFocusChange

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

这有一个缺点,用户必须离开edittext字段,因此我不确定它是否适合您正在尝试的操作…

我通常的做法是使用
onFocusChange

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

这有一个缺点,即用户必须离开edittext字段,因此我不确定它是否适合您正在尝试的操作…

谢谢您的回答,但是TextWatcher在每次文本更改后通知我,并且只需要在用户完成输入后通知我…但您如何知道他何时完成?当他按下回车键时,还是当他停止输入时。可能会在最后一次后TextChanged()调用之后使用一些时间延迟,并且只有在这个延迟之后,如果此时没有输入,才开始搜索过程。。。但我现在使用的是这样的东西。谢谢你的回答,但是TextWatcher在每次文本更改后都会通知我,我只需要在用户完成输入后收到通知……但是你怎么知道他什么时候完成?当他按下回车键时,还是当他停止输入时。可能会在最后一次后TextChanged()调用之后使用一些时间延迟,并且只有在这个延迟之后,如果此时没有输入,才开始搜索过程。。。但我现在用的是这样的东西。你也可以检查焦点的变化,比如@Barak在他的回答中说的。但是这取消了实时搜索的想法。这应该被标记为正确答案,它工作得很好。你也可以检查焦点的变化,就像@Barak在他的答案中说的那样。但这取消了实时搜索的概念。这应该被标记为正确答案,它工作得非常完美