1

我在方法中使用了一个字符串变量,我想将 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 语句在用户完成输入 ful 单词之前运行,它永远不会是真的。我不会使用按钮来关闭它。

我已经尝试实现一个 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 才能停止调用它。

一切都很好。我希望我能接受这两个答案。谢谢你。

4

2 回答 2

2

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);

并且也不要使用 == 运算符来比较字符串,而是使用:

如果(匹配字符串。等于(测试字符串))

于 2013-07-05T02:48:18.907 回答
2

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();

此字符串将为空,因此它永远不会评估该语句。它是空白的,因为用户从未输入任何内容。假设您想匹配字符串“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);
}
于 2013-07-05T02:52:09.310 回答