我在方法中使用了一个字符串变量,我想将EditText中的文本与该变量进行比较。
一旦匹配,我想将TextView更新为与目前不同的东西。代码如下:
public void textChangeMethod() {
TextView myText = (TextView)findViewById(R.id.my_Text);
EditText myEdit = (EditText)findViewById(R.id.my_Edit);
String testString = "Test";
String matchString = myEdit.getText().toString();
if(matchString == testString){
myText.setText("Finished")
}
然而,问题是,这个if语句在用户输入完全单词之前运行,并且它永远不会成立。我不会用按钮来解雇它。
我尝试过实现TextWatcher,但没有任何反应。我是Android开发的新手,我不确定我是否完全理解如何使用它。
我还考虑过使用倒数计时器,然后使用while循环来不断检查字符串的编辑文本值。我希望尽可能高效。
以下完整代码
public class NewClass extends Activity {
@SuppressLint("NewAPI")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_screen);
// Show the Up button in the action bar.
setupActionBar();
textChangeMethod();
}
public void textChangeMethod() {
//Local variables
final TextView myText = (TextView)findViewById(R.id.my_Text);
final String testString = "Test";
EditText myEdit = (EditText)findViewById(R.id.my_Edit);
final String matchString = myEdit.getText().toString();
TextWatcher filterTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after)
{
}
@Override
public void onTextChanged(CharSequence s,int i, int i2,int i3)
{
if(!TextUtils.isEmpty(s) && matchString.equals(s)){
myText.setText("Finished");
}
}
@Override
public void afterTextChanged(Editable arg0)
{
}
};
myEdit.addTextChangedListener(filterTextWatcher);
}
最终编辑
这两个答案都有帮助。我也可以在网上查看更多关于Text Watcher的文章。
我需要使用'aterTextChange'。但是,现在我遇到了一个新问题。如果我无法弄清楚,我会回来发一个新问题。
一如既往,感谢您的支持。
最终编辑#2
所以我在实现afterTextChanged之后遇到的问题是我的应用程序崩溃并且一直闪烁,并且完全无法使用。
快速堆栈搜索后,我需要实现removeTextChangedListener才能停止被调用。
一切都很好。我希望我能接受这两个答案。谢谢。
答案 0 :(得分:1)
Textwatcher是你的解决方案,如果你有问题要实现它,请发布你的代码,但这是一个实现Textwatcher的示例代码,你可以把你的if语句放在onTextChange()回调函数中:
TextWatcher filterTextWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count,int after)
{
}
public void onTextChanged(CharSequence s,int start, int before,int count)
{
if(s.equals(testString)){
myText.setText("Finished")
}
}
@Override
public void afterTextChanged(Editable arg0)
{
}
};
EditText filterText = (EditText)dialog.findViewById(R.id.edtItemFilter);
filterText.addTextChangedListener(filterTextWatcher);
并且也不要使用==运算符来比较字符串,而是使用:
如果(matchString.equals(的TestString))
答案 1 :(得分:1)
TextWatcher应该可以正常工作,您只需要初始化一次侦听器,因此在Activity中的 onCrateView() 中。同样@Arash说使用 .equals(CharSequence c) 而不是 == 操作数。除此之外,希望您的问题得到解答。
final TextView myText = (TextView)findViewById(R.id.my_Text);
EditText myEdit = (EditText)findViewById(R.id.my_Edit);
myEdit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
if(!TextUtils.isEmpty(charSequence) && myText.equals(charSequence)) {
// Do something with myText
}
}
@Override
public void afterTextChanged(Editable editable) { }
});
修改强>
看完你的完整代码后这一行:
final String matchString = myEdit.getText().toString();
此String将为空,因此它永远不会评估该语句。它是空白的,因为用户从未输入任何东西。假设你想匹配字符串“Hello”,你会这样做:
public void textChangeMethod() {
final TextView myText = (TextView)findViewById(R.id.my_Text);
EditText myEdit = (EditText)findViewById(R.id.my_Edit);
final String matchString = "Hello";
TextWatcher filterTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) {}
@Override
public void onTextChanged(CharSequence s,int i, int i2,int i3)
{
if(!TextUtils.isEmpty(s) && matchString.equals(s)){
myText.setText("Finished");
}
}
@Override
public void afterTextChanged(Editable arg0) {}
};
myEdit.addTextChangedListener(filterTextWatcher);
}