java - 使用匿名内部类 - 添加监听器和传递实例时发生冲突

标签 java android listener inner-classes anonymous-inner-class

我是 android 新手,第一次学习。

我正在制作一个非常简单的 fragment ,例如当用户单击按钮时,应用程序应该显示一条 Toast 消息。

我在网上阅读了很多教程。我在网上看到的所有教程都使用 anonymous inner class实现listeners以及他们的方法。

我尝试过的在这里:

public class MainActivity extends Activity {

    private Button mTrue;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTrue= (Button) findViewById(R.id.turebutton);


        mTrue.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Toast.makeText(MainActivity.this, R.string.correct_toast,Toast.LENGTH_LONG).show();

            }
        });

}

它工作得很好,但似乎很难理解。

我熟悉 Java 基础知识。我已阅读this我已经知道 inner classanonymous inner classjava

java ,如果我们编写类似此示例的代码,

public void init(){
      addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent me){
                       showStatus("mouse pressed");
             }
      });
}

MouseListener是一个接口(interface),然后我们创建 MouseAdapter 的实例并将其传递给调用 Listener的方法。

我有一些问题:

  1. 为什么我们在这里传递了接口(interface)( View.onClickListener )的实例?..我已经检查了文档, View.onClickListener是接口(interface)而不是类。

  2. setonClickListener看起来和 addMouseListener 一样。但矛盾的是在java中,我们必须 add听众和pass类的实例。这里事情是相反的。

我完全连线了。如果有人能解释清楚,请帮忙。提前致谢。

最佳答案

    mTrue.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(MainActivity.this, R.string.correct_toast,Toast.LENGTH_LONG).show();

        }
    });

此处您将传递一个实现 View.OnClickListener() 接口(interface)的匿名类的实例。

View 类的 setOnClickListener 方法接受 View.OnClickListener 类型的参数。因此,提供一个实现此接口(interface)的实例是可行的。

至于addMouseListener,假设您指的是this method Component 的,它也接受一个接口(interface) - MouseListener

但是,在您的示例中:

public void init(){
      addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent me){
                       showStatus("mouse pressed");
             }
      });
}

您正在向其传递一个继承自 MouseAdapter 的匿名类的实例,该类本身实现了 MouseListener 接口(interface)。

因此,这两个示例非常相似。

关于java - 使用匿名内部类 - 添加监听器和传递实例时发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25407657/

相关文章:

java - 如何将 2 个长值格式化为百分比格式?

android - RxAndroid ViewObservable NetworkOnMainThreadException

java - 实现多个接口(interface)的类的替代方案?

java - Hibernate 复合外键失败并生成 ID

java - 为自定义 JTable TableModel 创建 addRows() 方法

Android:如何发出 HTTP HEAD 请求?

android - 使用 ActionBarSherlock 的主题不起作用

java - NoClassDefFoundError:org/jagatoo/input/listeners/InputListener

java - 为什么 JOptionPane 阻止 JButton 上的 ActionListener?

java - 如何在java中从src播放声音文件