簡體   English   中英

addTextChangedListener(new TextWatcher())的Java語法

[英]java syntax of addTextChangedListener(new TextWatcher())

我有一個新手問題。 有人可以解釋這樣的代碼中是什么類型的Java語法。 我已經用谷歌搜索,但是我似乎不明白這是匿名類中TextWatcher的實現(或類似的東西)。 到目前為止,我所見過的所有實現在類定義中都有一個關鍵字Implements,但是這個沒有。 歡迎任何解釋(我知道這段代碼的用途以及如何使用它,對語法的理解是我的問題。)如果您可以用等效的方式重寫它,那也很好。 謝謝

mObjectOfEditText.addTextChangedListener(new TextWatcher() {
                public void onTextChanged(parameters) {}

            public void beforeTextChanged(parameters) {}

            public void afterTextChanged(parameters) {}
        });

當使用匿名類實現接口(或擴展類)時,不會給該類命名,因此,沒有地方可以編寫X implements Y (因為沒有X)。 這就是匿名的意思。 這正是您的示例中發生的情況。

addTextChangedListener需要一個實現TextWatcher的實例。 在該示例中,實現以內聯方式顯示為一個匿名類,該類實現該接口的所有方法。

您的示例可以使用實現該接口的常規類替換為等效代碼:

public class TextWatcherImpl implements TextWatcher 
{
    public void onTextChanged(parameters) {}

    public void beforeTextChanged(parameters) {}

    public void afterTextChanged(parameters) {}
}

然后,您可以通過以下方式使用該類:

TextWatcherImpl impl = new TextWatcherImpl ();
mObjectOfEditText.addTextChangedListener(impl);

看到這個答案和這個例子 ,實際上你是這樣的:

  EditText myTextBox = (EditText) findViewById(R.id.myTextBox);
  myTextBox.addTextChangedListener(new TextWatcher() {

  public void afterTextChanged(Editable s) {
     }

 public void beforeTextChanged(CharSequence s, int start, 
    int count, int after) {
     }

  public void onTextChanged(CharSequence s, int start, 
    int before, int count) {
    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);
    myOutputBox.setText(s);
     }
  });

1.基本

TextWatcher tw = new TextWatcher();

2.兒童班:

private class MyTextWatcher extends/implements TextWatcher() {

    @Override
    public void beforeTextChanged(parameters) {
        ...
    }

}

TextWatcher tw = new MyTextWatcher();

3.帶有匿名類:

public class Main {

final StringBuilder sb = ...;
TextWatcher tw = new TextWatcher() {

    {
        sb.append("TW: ");
    }

    @Override
    public void beforeTextChanged(parameters) {
        ... sb ... Main.this ...
    }

};

因此,匿名類不需要名稱,而是在其聲明中定義的。 此外,由於實例變量屬於基類/接口,因此仍將無法訪問新引入的公共方法或字段。 匿名類可以有效地使用周圍類的final局部變量,字段和字段(此處為Main.this )。 (變量必須有效地是最終變量,因為在類中創建了一個新的變量sb因為sb的變量范圍/生存期將有所不同。語言設計者發現最好讓這兩個變量始終保持相同的值。)

初始化程序塊上方的{ ... }代替構造函數。

我認為在99%的情況下,您都希望在用戶鍵入時更新String 這完全可以正常工作:

String string;

mObjectOfEditText.addTextChangedListener(new TextWatcher() {
        public void onTextChanged(...) {}

        public void beforeTextChanged(...) {}

        public void afterTextChanged(Editable e) {
            string = e.toString();
        }
});

但是,可以一遍又一遍地創建一個抽象類,而不是一遍onTextChanged寫空的onTextChangedbeforeTextChanged

abstract class LightTextWatcher implements TextWatcher {
    @Override public final void beforeTextChanged(...) {}
    @Override public final void onTextChanged(...) {} 
}
...
mObjectOfEditText.addTextChangedListener(new LightTextWatcher() {
    public void afterTextChanged(Editable e) {
        string = e.toString();
    }
});

現在,如果您有許多TextView (或作為TextViewEditText ),則第二種變體的詳細代碼要少得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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