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

去写了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

还是用的是

?
1
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

后来用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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的焦点(的事件)

可以用如下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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得到焦点;

都可以获得对应的事件

->

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值