2013-03-28 48 views
3

即時通訊工作與android的TextWatcher做到這一點:當用戶鍵入,保存什麼類型和保存後,改變Edittext內的字符。例如,我有一個像「hi hi happy」這樣的常量文本,並且我在edittext用戶中輸入的每個內容都會看到該文本正在寫入(此字符串在用戶輸入時顯示爲Tandemly)!但用戶鍵入的主要文本存儲在一個變量中。我用這個代碼裏面afterTextChanged:阻止在android的textwatcher兩次運行

if(s.toString().charAt(s.length()-1) != 'a'){ 
    //save inside freaktext variable(append) 
    freaktext=freaktext+s.toString().charAt(s.length()-1); 

     //change edittext value(what user see's) 
    txtfreak.setText(s.toString().substring(0, s.length()-1) + "a"); 
    txtfreak.setSelection(txtfreak.getText().length()); 
}else{ 
    freaktext=freaktext+"a"; 
} 

我這段代碼我說,如果鍵入的字符不是「a」,將它保存在一個名爲「freaktext」變量,然後更改的EditText值,並把「一」字edittext中的字符串結尾。但如果用戶鍵入「a」,只需將其保存在freaktext中即可。

我的問題是:當用戶輸入一個沒有「a」字符時,一切正常,我的代碼保存輸入字符,然後修改edittext值,但是當edittext值更改整個代碼再次運行,因爲上次我改變它並放上一個「a」,我的代碼的第二部分(else)運行並再次保存「a」到保存的字符串的末尾。事實上,當我輸入「q」時,我在保存的字符串中看到「qa」!我希望那個用戶直接在鍵盤上鍵入「a」,「a」保存並且在其他情況下不會。事實上,我的其他部分只在用戶直接按下鍵盤上的「a」鍵時運行。我可以這樣做嗎?請幫幫我,這個代碼浪費我的時間1天

回答

3

外面的功能,某處:

boolean weChangedIt = false; 

afterTextChanged

if (weChangedIt) { 
    weChangedIt = false; 
} else { 
    if(s.toString().charAt(s.length()-1) != 'a'){ 
     weChangedIt = true; 
     freaktext=freaktext+s.toString().charAt(s.length()-1); 
     txtfreak.setText(s.toString().substring(0, s.length()-1) + "a"); 
     txtfreak.setSelection(txtfreak.getText().length()); 
    }else{ 
     freaktext=freaktext+"a"; 
    } 
} 
+0

哇!謝謝。我嘗試了幾次這種方法,但每次我有一個問題,從來沒有我的代碼是美麗的,格式良好。但你的代碼工作正常,我想感謝你我的朋友! :) – Fcoder 2013-03-28 06:21:13

1
txtfreak.removeTextChangedListener(whateveryourlistenername); 
if(s.toString().charAt(s.length()-1) != 'a'){ 
freaktext=freaktext+s.toString().charAt(s.length()-1); 
txtfreak.setText(s.toString().substring(0, s.length()-1) + "a"); 
txtfreak.setSelection(txtfreak.getText().length()); 

}else{ 
freaktext=freaktext+"a"; 
} 
txtfreak.addTextChangedListener(whateveryourlistenername); 
+0

+1好的答案。另外,你可以使用'this'而不是'whateveryourlistenername'。 – Tushar 2013-03-28 06:22:34

+0

我不知道他的聽衆是什麼,他可以有一個類擴展TextWatcher – 2013-03-28 06:26:37

+0

除非他將'Editable'轉發給另一個函數,否則無論他的類是否實現了TextWatcher,還是它是匿名的內部函數類。 – Tushar 2013-03-28 06:28:08