1

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

          }
     });
4

2 回答 2

2

由于这是作业,我不会给你答案。(你的老师做了很多忙碌的工作,给你一个很好的例子。)但我会给你一个提示:

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

注意beforeafter相对count。这将帮助您了解用户何时添加或减少文本。

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

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

于 2013-02-19T16:32:46.693 回答
0

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

TextWatcher 文档:http: //developer.android.com/reference/android/text/TextWatcher.html

编辑:我认为您不必担心这一点,以为您最初将其写入 EditText,但我现在看到您正在将更改写入 TextView,保留在后面仍然没有什么坏处你的想法。

于 2013-02-19T17:27:21.977 回答