我有一个20 EditTexts
的活动。如果输入了任何内容,我想显示一条消息。有没有办法知道输入是否已被提供(数据已更改)?而不是将20个侦听器附加到每个字段?
答案 0 :(得分: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
小部件使用。
答案 1 :(得分: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
}
}