我有一个新手问题。有人可以在这样的代码中解释什么类型的java语法。我用google搜索了,但我似乎不明白这是一个匿名类中的TextWatcher的实现,(或者类似的东西)。到目前为止,我所见过的所有实现都在一个类定义中有一个关键字实现,但是这个实现没有。任何解释都是受欢迎的(我知道这段代码的作用以及如何使用它,对语法的理解是我的问题。)如果你能以相同的方式重写它也会很棒。感谢
mObjectOfEditText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(parameters) {}
public void beforeTextChanged(parameters) {}
public void afterTextChanged(parameters) {}
});
答案 0 :(得分:1)
当您使用匿名类实现接口(或扩展类)时,您不能为该类命名,因此您无法在其中编写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);
答案 1 :(得分:0)
请参阅此answer和此example,实际上您是这样做的:
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);
}
});
答案 2 :(得分:0)
<强> 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的变量范围/生命周期会有所不同。语言设计者发现让这两个变量更好始终保持相同的值。)
在初始化块上方使用{ ... }
作为构造函数的替代。
答案 3 :(得分:0)
我认为在99%的情况下,您希望在用户输入时更新SharedPreferences prefs = getSharedPreferences("mypref", MODE_PRIVATE);
String restoredFilePath = prefs.getString("audioFilePath", null);
if (restoredFilePath != null) {
// here you have the restored file path
}
。
这完全可以正常工作:
String
但是,不是一遍又一遍地写空String string;
mObjectOfEditText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(...) {}
public void beforeTextChanged(...) {}
public void afterTextChanged(Editable e) {
string = e.toString();
}
});
和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();
}
});
s(或TextView
s EditText
s),那么第二个版本的详细代码就会少得多。