[英]How to update the same EditText using TextWatcher?
在我的Android應用程序中,我需要實現一個TextWatcher接口來實現onTextChanged
。 我遇到的問題是,我想用一些額外的字符串更新相同的EditText。 當我嘗試這樣做時,程序終止。
final EditText ET = (EditText) findViewById(R.id.editText1);
ET.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
try
{
ET.setText("***"+ s.toString());
ET.setSelection(s.length());
}
catch(Exception e)
{
Log.v("State", e.getMessage());
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void afterTextChanged(Editable s)
{
}
});
我的程序終止,甚至我嘗試捕獲異常,就像我的代碼仍然終止。 有誰知道為什么會發生這種情況以及如何實現這一目標? 謝謝。
TextView
的內容在onTextChanged
事件中是不可編輯的。
相反,您需要處理afterTextChanged
事件才能對文本進行更改。
有關更全面的說明,請參閱: Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged
注意 : onTextChanged
出錯
很明顯,通過不斷更改afterTextChanged
事件上的文本 ,您將導致無限循環。
來自參考 :
public abstract void afterTextChanged(Editable s)
調用此方法通知您,在s中的某個位置,文本已更改。 從這個回調中對s進行進一步的更改是合理的,但要注意不要讓自己進入無限循環,因為你所做的任何更改都會導致以遞歸方式再次調用此方法。 ...
建議1 :如果可以的話,檢查觸發事件時s
是否已經是您想要的。
@Override public void afterTextChanged(Editable s) { if( !s.equalsIngoreCase("smth defined previously")) s = "smth defined previously"; }
synchronized
方法。 注2 :將輸入格式化為部分隱藏n個星,直到最后4個字符(****四個)
你可以在建議1中使用這樣的東西:
@Override
public void afterTextChanged(Editable s)
{
String sText = ET.getText().toString()
if( !isFormatted(sText))
s = format(sText);
}
bool isFormatted(String s)
{
//check if s is already formatted
}
string format(String s)
{
//format s & return
}
遲到的答案,如果有人看這個是我怎么做的。
這是代碼。
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d("log", "before");
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d("log", "after");
editText.removeTextChangedListener(this);
ediText.setText("text you wanted to put");
editText.addTextChangedListener(this);
}
@Override
public void afterTextChanged(Editable s) {
}
});
為了補充Zortkun的答案 (示例代碼非常破碎),您可以使用afterTextChanged()
來更新相同的EditText
:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
if (!editable.toString().startsWith("***")) {
editable.insert(0, "***");
}
}
});
熟悉Editable
界面以了Editable
insert()
之外的其他操作。
請注意,很容易以無限循環結束(您再次觸發afterTextChanged()
后更改),因此通常您會在if條件內進行更改,如上所述。
正如afterTextChanged()
javadocs所說:
從這個回調中對s進行進一步的更改是合理的,但要注意不要讓自己進入無限循環,因為你所做的任何更改都會導致以遞歸方式再次調用此方法。
這是一個適合我的片段
etPhoneNumber.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
if (!s.toString().equals(Utils.getFormattedNumber(s.toString()))) {
s.replace(0, s.length(), Utils.getFormattedNumber(s.toString()));
}
}
});
其中Utils.getFormattedPhoneNumber()
是返回格式化數字的方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.