android edittext onchange侦听器

问题描述 投票:107回答:8

我对TextWatcher有点了解,但是会在您输入的每个字符上触发。我希望在用户完成编辑时触发一个监听器。可能吗?同样在TextWatcher中,我得到了Editable的实例,但是我需要EditText的实例。我怎么得到的?

EDIT:第二个问题更为重要。请回答。

android android-edittext textwatcher
8个回答
200
投票

首先,如果EditText失去焦点,或者用户按下完成按钮(取决于您的实现方式和最适合您的方式),您可以查看用户是否完成了文本编辑。其次,仅当您将EditText声明为实例对象时,才能在TextWatcher中获得EditText实例。即使您不应该在EditText中编辑TextWatcher,因为它并不安全。

编辑:

为了能够将EditText实例放入您的TextWatcher实现中,您应该尝试执行以下操作:

public class YourClass extends Activity {

    private EditText yourEditText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        yourEditText = (EditText) findViewById(R.id.yourEditTextId);

        yourEditText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                // you can call or do what you want with your EditText here

                // yourEditText... 
            }

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

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

请注意,上面的示例可能有一些错误,但我只是想向您展示一个示例。


13
投票

[困扰我的是,为所有EditText字段实现侦听器要求我使用难看的冗长代码,因此我编写了以下类。可能对绊倒这个的人有用。

public abstract class TextChangedListener<T> implements TextWatcher {
    private T target;

    public TextChangedListener(T target) {
        this.target = target;
    }

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

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

    @Override
    public void afterTextChanged(Editable s) {
        this.onTextChanged(target, s);
    }

    public abstract void onTextChanged(T target, Editable s);
}

现在实现侦听器会更加干净。

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

关于触发频率,也许可以在给定a之后执行检查以在//Do stuff中运行所需的代码


12
投票

使用黄油刀]的任何人。您可以使用:

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}

6
投票

我已经使用AutotextView完成了它:


3
投票
 myTextBox.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) {  

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);  
    myOutputBox.setText(s);  

    }  
});  

2
投票

[TextWatcher对我不起作用,因为它不断为每个EditText触发并弄乱其他值。


1
投票

据我所知,只有两种方法可以做到。您怎么知道用户已经写完一个单词?要么失去焦点,要么单击“确定”按钮。我没办法知道用户按下了最后一个字符...


0
投票

Watcher方法将在每个字符输入上触发。因此,我基于onFocusChange方法构建了此代码:

© www.soinside.com 2019 - 2024. All rights reserved.