我知道一点点,TextWatcher
但这会触发您输入的每个字符。我希望在用户完成编辑时触发一个监听器。可能吗?另外,TextWatcher
我得到的实例,Editable
但我需要的实例EditText
。我怎么得到的?
编辑:第二个问题更重要。请回答。
我知道一点点,TextWatcher
但这会触发您输入的每个字符。我希望在用户完成编辑时触发一个监听器。可能吗?另外,TextWatcher
我得到的实例,Editable
但我需要的实例EditText
。我怎么得到的?
编辑:第二个问题更重要。请回答。
Answers:
首先,您可以查看用户是否EditText
失去焦点或是否按下完成按钮(取决于您的实现以及最适合您的选择)而完成了文本的编辑。其次,仅当您将声明为实例对象时,您才能EditText
在其中获得一个实例。即使您不应该在中进行编辑,因为它也不安全。TextWatcher
EditText
EditText
TextWatcher
编辑:
为了使EditText
实例进入您的TextWatcher
实现,您应该尝试执行以下操作:
public class YourClass extends Activity {
private EditText yourEditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
yourEditText = (EditText) findViewById(R.id.yourEditTextId);
yourEditText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
// you can call or do what you want with your EditText here
// yourEditText...
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
}
}
请注意,上面的示例可能有一些错误,但我只是想向您展示一个示例。
困扰我的是,为所有EditText字段实现侦听器要求我使用难看的冗长代码,因此我编写了以下类。可能对绊脚的人有用。
public abstract class TextChangedListener<T> implements TextWatcher {
private T target;
public TextChangedListener(T target) {
this.target = target;
}
@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 s) {
this.onTextChanged(target, s);
}
public abstract void onTextChanged(T target, Editable s);
}
现在实现一个侦听器会更加干净。
editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
@Override
public void onTextChanged(EditText target, Editable s) {
//Do stuff
}
});
至于触发的频率,也许可以实施一种检查,以//Do stuff
在给定指令后运行所需的代码。
我已经使用了AutotextView
:
AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
seq = cs;
}
@Override
public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
new SearchTask().execute(seq.toString().trim());
}
});
myTextBox.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {
TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);
myOutputBox.setText(s);
}
});
TextWatcher
它对我不起作用,因为它不断为EditText
每个人开火并弄乱彼此的价值观。
这是我的解决方案:
public class ConsultantTSView extends Activity {
.....
//Submit is called when I push submit button.
//I wanted to retrieve all EditText(tsHours) values in my HoursList
public void submit(View view){
ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
}
}
因此,通过使用该getChildAt(xx)
方法,您可以检索中的任何项目,ListView
并使用获取单个项目findViewById
。然后它将提供最新的价值。
据我所知,只有两种方法可以做到。您怎么知道用户已经写完一个单词?要么失去焦点,要么单击“确定”按钮。我没有办法知道用户按下了最后一个字符...
因此,调用onFocusChange(View v, boolean hasFocus)
或添加按钮以及单击它的单击侦听器。
Watcher方法将在每个字符输入上触发。因此,我基于onFocusChange方法构建了以下代码:
public static boolean comS(String s1,String s2){
if (s1.length()==s2.length()){
int l=s1.length();
for (int i=0;i<l;i++){
if (s1.charAt(i)!=s2.charAt(i))return false;
}
return true;
}
return false;
}
public void onChange(final EditText EdTe, final Runnable FRun){
class finalS{String s="";}
final finalS dat=new finalS();
EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {dat.s=""+EdTe.getText();}
else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}
}
});
}
要使用它,只需像这样调用:
onChange(YourEditText, new Runnable(){public void run(){
// V V YOUR WORK HERE
}}
);
您可以通过将!comS(dat.s,“” + EdTe.getText())替换为!equal函数来忽略comS函数。但是,相等函数本身有时无法在运行时正常工作。
当用户输入焦点时,onChange侦听器将记住EditText的旧数据,然后在用户失去焦点或跳转到其他输入时比较新数据。如果比较旧的String而不是新的String,则会触发工作。
如果您只有1个EditText,则您需要通过在Windows窗口外制作一个Ultimate Secret Transparent Micro EditText来创建ClearFocus函数,并要求将焦点对准它,然后通过导入方法管理器隐藏键盘。