android edittext onchange监听器

时间:2012-06-21 08:17:41

标签: android android-edittext textwatcher

我对TextWatcher了解一点,但是你输入的每一个角色都会触发。我想要一个在用户完成编辑时触发的监听器。可能吗?同样在TextWatcher我得到Editable的实例,但我需要一个EditText的实例。我怎么做到的?

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

9 个答案:

答案 0 :(得分:191)

首先,如果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) {}
        });
    }
}

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

答案 1 :(得分: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
            }
        });

至于它发射的频率,可以在给定的

之后执行检查以在//Do stuff中运行他们想要的代码

答案 2 :(得分:11)

任何人使用 ButterKnife 。您可以使用:

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

}

答案 3 :(得分:6)

我是使用AutotextView完成的:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        seq = cs;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        new SearchTask().execute(seq.toString().trim());
    }

});

答案 4 :(得分: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);  

    }  
});  

答案 5 :(得分:2)

TextWatcher对我来说不起作用,因为它会为每个EditText开火并且弄乱对方的价值。

这是我的解决方案:

public class ConsultantTSView extends Activity {
    .....

    //Submit is called when I push submit button.
    //I wanted to retrieve all EditText(tsHours) values in my HoursList

    public void submit(View view){

        ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
        String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
    }
}

因此,通过使用getChildAt(xx)方法,您可以检索ListView中的任何项目,并使用findViewById获取单个项目。然后它将提供最新的价值。

答案 6 :(得分:1)

据我所知,只有两种方法可以做到。你怎么知道用户写完了一个单词?焦点丢失或点击“确定”按钮。在我的脑海里,你无法知道用户按下了最后一个角色......

所以请致电onFocusChange(View v, boolean hasFocus)或添加一个按钮和一个点击监听器。

答案 7 :(得分:0)

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

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

要使用它,只需像这样调用:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

您可以通过将!comS(dat.s,“” + EdTe.getText())替换为!equal函数来忽略comS函数。但是,相等函数本身有时无法在运行时正常工作。

onChange侦听器将在用户焦点输入时记住EditText的旧数据,然后在用户失去焦点或跳转到其他输入时比较新数据。如果比较旧的String而不是新的String,则会触发工作。

如果您只有1个EditText,那么您将需要通过在Windows?外部制作Ultimate Secret Transparent Micro EditText?并要求将焦点对准它,然后通过Import Method Manager隐藏键盘来创建ClearFocus函数。

答案 8 :(得分:0)

在Kotlin中,使用设置Android EditText侦听器,

   val searchTo : EditText = findViewById(R.id.searchTo)
   searchTo.addTextChangedListener(object : TextWatcher {
    override fun afterTextChanged(s: Editable) {

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

        // yourEditText...
    }

    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
})