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得到焦点;
都可以获得对应的事件
->
这样就可以在代码中添加后续的各种自己想要的任何处理了。