簡體   English   中英

如何使用TextWatcher更新相同的EditText?

[英]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"; } 
  • 建議2 :如果你需要做更復雜的事情(格式化,驗證),你可以使用像這篇文章中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
    }

遲到的答案,如果有人看這個是我怎么做的。

  • 最初設置addTextChangedListener
  • 在其中一個回調(比如onTextChanged())中刪除addTextChangedListener
  • 仍然有興趣接收更新再添加回來。

這是代碼。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM