[英]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
寫空的onTextChanged
和beforeTextChanged
:
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
(或作為TextView
的EditText
),則第二種變體的詳細代碼要少得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.