【已解决】Android中如何得知当前View中的EditText正在被编辑或改动,即如何检测EditText的焦点

【背景】

Android中,当前Tab页面内多个Group,每个Group中一个或多个EditText或TextView

现在想要实现,当EditText变量,获得了焦点,被编辑时,可以捕获事件。

【解决过程】

1.搜:

listen edittext modify

找到:

java – How do listen EditText? – Stack Overflow

没用。

2.又搜:

android edittext on change

找到:

Android: On EditText Changed Listener – Stack Overflow

java – android on Text Change Listener – Stack Overflow

android edittext onchange listener – Stack Overflow

3.再去参考:

TextWatcher | Android Developers

去写了:

  mTextWatcher = new TextWatcher() {
   @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 arg0) {
    // TODO Auto-generated method stub
   
   }

但是问题来了:

我希望是,当一个EditText的值被修改后,能获得当前的EditText的对象。而上述函数中,是无法获得当前的EditText的。。。

所以要想办法,得知:

当控件获得焦点,正在被修改:更新状态为edited

当控件失去焦点,已经被修改:如果值与之前的值相同,取消edited,如果不同,则保持edited状态

4.参考:

java – Monitor the changes of a EditText – Stack Overflow

还是用的是

editText.addTextChangedListener(new TextWatcher() {

其实希望的是:

在beforeTextChanged 可以获得当前N多个EditText,到底修改的是哪个EditText。

5.再去搜:

android edittext get focus

参考这个:

android – How do I keep track of an edittext field across PagerAdapter slides? – Stack Overflow

和我遇到的很像:

当前页面有N多个EditText,然后对于想要监控每个EditText的话,只用一个TextWatcher虽然可以处理EditText中的text,但是却不知道当然是那个EditText被修改了。。

6.所以最终问题转化为:

android中如何检测EditText的焦点

搜:

android edittext detect focus

找到:

android – Event for Handling the Focus of the EditText – Stack Overflow

后来用:

OnFocusChangeListener mFocusChangedListener;
mFocusChangedListener = new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus){
         Toast.makeText(getApplicationContext(), "got focus: " + v.toString(), Toast.LENGTH_LONG).show();
        }else {
         Toast.makeText(getApplicationContext(), "lost focus: " + v.toString(), Toast.LENGTH_LONG).show();
        }
    }
};
EditText variableValueView = (EditText) variableLayout.findViewById(R.id.variableValue);
variableValueView.setOnFocusChangeListener(mFocusChangedListener);

就可以检测到:

EditText 获得和失去焦点时候的事件了。

 

【总结】

想要得到当前(某个View)页面正在编辑的EditText是哪个,实际上就是,如何获得或捕获EditText的焦点(的事件)

可以用如下代码:

OnFocusChangeListener mFocusChangedListener;
mFocusChangedListener = new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus){
         Toast.makeText(getApplicationContext(), "got focus: " + v.toString(), Toast.LENGTH_LONG).show();
        }else {
         Toast.makeText(getApplicationContext(), "lost focus: " + v.toString(), Toast.LENGTH_LONG).show();
        }
    }
};
EditText variableValueView = (EditText) variableLayout.findViewById(R.id.variableValue);
variableValueView.setOnFocusChangeListener(mFocusChangedListener);

就可以实现:

对于已经设置了setOnFocusChangeListener的EditText,每当:

  • 之前一个EditText失去焦点;
  • 新获得焦点的EditText得到焦点;

都可以获得对应的事件

->

这样就可以在代码中添加后续的各种自己想要的任何处理了。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量