0

我最近进入了 Android 并一直在查看有关内部类的示例,但并不真正了解它们的用途。在制作听众和制作完整课程时经常使用它们,对吗?也许有人可以用外行的方式向我解释,在这种情况下使用内部匿名类的替代方法是什么?这段代码:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

谢谢

4

3 回答 3

4

一种替代模式是使容器类本身成为侦听器。

public class MyClass implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // Do something when button is clicked
    }

    public void initOrSomething() {
        button.setOnClickListener(this);
    }
}

但是,如果您有多个按钮需要采取不同的行为方式,您可能会遇到麻烦。

另一种方法是为每个按钮设置不同的侦听器类

public class Button1Listener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // Do something when button1 is clicked
    }
}

public class Button2Listener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // Do something when button2 is clicked
    }
}


button1.setOnClickListener(new Button1Listener());
button2.setOnClickListener(new Button2Listener());

匿名内部类只是第二种模式的更紧凑的表示。

编辑:两种模式的变化都是可能的,其中检查 View 对象的内容以确定单击了哪个按钮或将构造函数参数传递给侦听器类以更改侦听器行为等。

于 2014-03-14T22:56:23.433 回答
0

在制作听众和制作完整课程时经常使用它们,对吗?

Android 中的监听器,或者其他情况下的其他接口。但本质上,仅此而已。

在这种情况下使用内部匿名类的替代方法是什么?

这将是创建一个实现此接口的类并将其作为参数提交。例如:

public class MyListener
    implements View.OnClickListener
{
    // implement onClick(), etc etc
}

// In code:

button.setOnClickListener(new MyListener(...));
于 2014-03-14T22:56:11.353 回答
0

这很简单:你所做的只是创建一个类。对于 JVM(或本例中的 dalvik),类是它自己的编译单元(文件)、内部类还是匿名类(*)都没有关系。所以你有三个同样有效的选择:

选项 1您的示例:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    }
});

选项 2命名内部类:

public MyActivity extends Activity {

 static class MyListener implements View.OnClickListener {
   @Override 
   public void onClick(View v) {
    // do something 
   }
}
....

  button.setOnClickListener(new MyListener());
}

选项 3不同的文件:

文件 MyListener.java

public class MyListener implements View.OnClickListener {
 @Override 
 public void onClick(View v) {
  // do something 
 }
}

文件 MyActivity.java

import MyListener.java
public MyActivity extends Activity {
....

  button.setOnClickListener(new MyListener());
}

您使用这些选项中的哪一个完全是主观的 - 根据您的需求和使用情况,一个或另一个更有意义。但是,通常在 UI 侦听器中,您不希望有任何与您正在编程的 Activity 的逻辑脱节的逻辑。因此,您使用匿名类,因为所有代码都保存在一个地方并使其具有良好的可读性。

于 2014-03-14T22:56:48.183 回答