2013-02-19 52 views
1

我是Android開發新手(我正在上課),請耐心等待。使用TextWatcher偵聽器顯示已編輯的文本

我必須使用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()); 

      } 
    }); 
+1

這是你老師給你的一個很好的例子!有了它,您可以看到LogCat中的每個播放改變。在我看來,如果你玩EditText(輸入隨機字符,移動光標,刪除東西),你會了解到三種方法如何比任何人都能解釋得更好更快...... – Sam 2013-02-19 16:05:00

+0

謝謝!但是,我不確定如何訪問LogCat以查看這些更改。 – 2013-02-19 16:06:58

+1

我明白了,那會是一個問題。 :)你在使用Eclipse嗎?進入'Window> Show View> Other ...'然後'Android> LogCat'(顯然不要使用已棄用的版本)。 – Sam 2013-02-19 16:10:02

回答

2

由於這是功課,我不會給你答案。 (你的老師通過給你一個很好的例子開始做了很多繁忙的工作。)但我會給你一個提示:

例如,如果什麼是最初鍵入編輯(如用戶鍵入「Hoozledoofer」,然後突出顯示「zledoof」,最後在其位置鍵入「v」),我必須首先輸出格式爲:'zledoof' => 'v'這是顯示在TextView的第一行。

請注意beforeafter相對於count。這將幫助您知道用戶何時添加或減少文本。

第二部分是容易的,你似乎已經是答案:

然後,第二行會顯示完整的文本現在出現在的EditText小部件:Hoover
我知道我需要輸出afterTextChanged方法中的結果。

+0

如果您覺得如此傾向於看到它,我將我的新代碼發佈在我原始代碼的底部。它確實按照預期給出了最終結果,但每次擊鍵都會不斷更新。我不確定這是否是預期的效果。我不認爲我掌握了關於使用前後相對數的使用暗示。我想不出有什麼理由使用它們。 :( – 2013-02-19 16:58:28

+1

我相信你的教授想要看到每一個變化,正如你發現TextWatchers被稱爲_a lot_,除非你忽略輸入,你不能限制這個(當然,我不知道這個任務是什麼,所以如果你有一個問題最好問問你的老師)看起來你找到了一個解決方案,而不需要'之前'或'之後',所以隨時忽略我的建議的一部分。你的解決方案簡單,簡潔,做得好!在'afterTextChanged()'''newStr'和's'之間有什麼區別?) – Sam 2013-02-19 17:37:58

+0

感謝您的幫助,我確信newStr是多餘的,我可能會取消它。關於那個。 – 2013-02-19 17:41:47

0

另一件要非常小心,是不會改變的beforeTextChanged或onTextChanged回調的CharSequence,以及需要注意的是,如果CharSequence的在afterTextChanged回調改變,這將導致另一個調用系列的回調(無限遞歸是可能的,如果不小心)。

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

編輯:我不認爲你需要擔心這一點,以爲你最初它寫的EditText,但我現在看到你正在寫的變爲一個TextView ,儘管如此,仍然不會傷害你的想法。

相關問題