我有一个 20 的活动EditTexts
。如果输入了任何内容,我想显示一条消息。有没有办法知道是否提供了输入(数据已更改),而不是为每个字段附加 20 个侦听器?
问问题
333 次
2 回答
1
这是一个基类的示例,它负责通知子类是否EditText
正在使用它们的任何小部件(如果存在)。根据您在用户输入内容时要执行的操作,您可能需要更改我的示例以适合您的特定情况。
您将继承的基本活动:
public abstract class BaseTextWatcherActivity extends Activity {
private TextWatcher mInputObserver = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
onInputChange(s.toString());
}
};
private boolean mOptimize = false;
@Override
public void setContentView(int layoutResID) {
View content = getLayoutInflater().inflate(layoutResID, null);
initInputsObservers((ViewGroup) content);
mOptimize = true;
super.setContentView(content);
}
@Override
public void setContentView(View view) {
if (view instanceof EditText) {
((EditText) view).addTextChangedListener(mInputObserver);
} else if (view instanceof ViewGroup && !mOptimize) {
initInputsObservers((ViewGroup) view);
mOptimize = false;
}
super.setContentView(view);
}
/**
* Implement this method to allow your activities to get notified when one
* of their {@link EditText} widgets receives input from the user.
*
* @param s the string that was entered by the user in one of the EditTexts.
*/
public abstract void onInputChange(String s);
/**
* This will recursively go through the entire content view and add a
* {@link TextWatcher} to every EditText widget found.
*
* @param root
* the content view
*/
private void initInputsObservers(ViewGroup root) {
final int count = root.getChildCount();
for (int i = 0; i < count; i++) {
final View child = root.getChildAt(i);
if (child instanceof EditText) {
((EditText) child).addTextChangedListener(mInputObserver);
} else if (child instanceof ViewGroup) {
initInputsObservers((ViewGroup) child);
}
}
}
}
然后,您在活动中所要做的就是实现onInputchange
回调,让您知道用户EditTexts
在当前布局之一中输入了某些内容。您可能希望查看活动类中的关键事件回调以获得更简单的内容,但如果我没记错的话,这些事件是由TextView
/EditText
小部件消耗的。
于 2012-10-03T15:45:55.870 回答
0
让您的 TextViews 都调用addTextChangedListener()给他们您的 Activity 作为参数(this)。让您的 Activity 实现TextWatcher并覆盖 afterTextChanged()。每当其中一个 TextView 更改时,将调用 afterTextChanged()。这是您的代码应该是什么样子的想法
public class YouActivity extends Activity implements TextWatcher{
@Override
public void onCreate(Bundle savedInstanceState)
{
[...]
textView1.addTextChangedListener(this);
textView2.addTextChangedListener(this);
[...]
}
@Override
public void afterTextChanged (Editable s)
{
//do something
}
}
于 2012-10-03T13:59:22.660 回答