addTextChangedListener的java语法(new TextWatcher())

时间:2014-10-14 13:22:19

标签: java android interface

我有一个新手问题。有人可以在这样的代码中解释什么类型的java语法。我用google搜索了,但我似乎不明白这是一个匿名类中的TextWatcher的实现,(或者类似的东西)。到目前为止,我所见过的所有实现都在一个类定义中有一个关键字实现,但是这个实现没有。任何解释都是受欢迎的(我知道这段代码的作用以及如何使用它,对语法的理解是我的问题。)如果你能以相同的方式重写它也会很棒。感谢

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

            public void beforeTextChanged(parameters) {}

            public void afterTextChanged(parameters) {}
        });

4 个答案:

答案 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),那么第二个版本的详细代码就会少得多。