使用TextWatcher侦听器显示已编辑的文本

时间:2013-02-19 15:51:14

标签: android textview android-edittext textwatcher

我是Android开发的新手(我正在上课),所以请耐心等待。

我必须使用TextWatcher将EditText小部件中的已编辑文本显示到TextView小部件中。

例如,如果最初输入的内容被编辑(如果用户键入“Hoozledoofer”然后突出显示“zledoof”并最终在其位置键入“v”),我将不得不首先以格式输出更改:

'zledoof' => 'v'

这显示在TextView的第一行。然后,第二行将显示EditText小部件中现在出现的全文:

Hoover

我不知道该怎么做。我知道我需要在afterTextChanged方法中输出结果。如何保存已完成的内容,并仍然保持输出所输入的内容?有什么建议吗?

下面是类中给出的TextWatcher示例:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    txtEdit = (EditText) findViewById(R.id.editText1);
    viewText = (TextView) findViewById(R.id.text);

     txtEdit.addTextChangedListener (new TextWatcher() {

          public void beforeTextChanged(CharSequence s, int start, int count, int after) {
              Log.i("TC", "beforeTC " + s.toString() + " "
                      + s.subSequence(start, start + count).toString());
          }

          public void onTextChanged(CharSequence s, int start, int before, int count) {
              Log.i("TC", "onTC " + s.toString() + " "
                      + s.subSequence(start, start + count).toString());
          }

          public void afterTextChanged(Editable s) {
              Log.i("TC", "afterTC " + s.toString());
          }
     });
}

这是我尝试过的,它提供了预期的最终结果,但它会继续显示所做的每一个小编辑。这可能不是问题,可能对教授有用:

     txtEdit.addTextChangedListener (new TextWatcher() {

         String changed, newStr, edit;

          public void beforeTextChanged(CharSequence s, int start, int count, int after) {
              changed = s.subSequence(start, start + count).toString();

              //Log.i("TC", "beforeTC " + s.toString() + " "
                      //+ s.subSequence(start, start + count).toString());
          }

          public void onTextChanged(CharSequence s, int start, int before, int count) {
              newStr = s.toString();
              edit = s.subSequence(start, start + count).toString();

              //Log.i("TC", "onTC " + s.toString() + " "
                      //+ s.subSequence(start, start + count).toString());
          }

          public void afterTextChanged(Editable s) {
              viewText.setText(changed + " => " + edit + "\n" + newStr);

              //Log.i("TC", "afterTC " + s.toString());

          }
     });

2 个答案:

答案 0 :(得分:2)

由于这是作业,我不会给你答案。 (你的老师通过给你一个好的榜样开始做很多繁忙的工作。)但我会给你一个提示:

  

例如,如果最初输入的内容被编辑(如果用户键入“Hoozledoofer”然后突出显示“zledoof”并最终在其位置键入“v”),我将不得不首先以格式输出更改:'zledoof' => 'v'这显示在TextView的第一行。

注意相对于before的{​​{1}}和after。这将帮助您了解用户何时添加或减去文本。

第二部分很简单,你似乎已经有了答案:

  

然后,第二行将显示EditText小部件中现在出现的全文:count
   我知道我需要在afterTextChanged方法中输出结果。

答案 1 :(得分:0)

另一件需要注意的事情是,不要更改beforeTextChanged或onTextChanged回调中的CharSequence,并注意如果在afterTextChanged回调中更改CharSequence,它将导致对该系列回调的另一次调用(如果不小心,可以进行无限递归。

TextWatcher doc:http://developer.android.com/reference/android/text/TextWatcher.html

编辑:我认为你不必担心这个,以为你最初把它写到了EditText,但我现在看到你正在把改变写入TextView,仍然没有受到影响但是你的思绪背后。