【问题标题】:Why pass an interface as an argument to a function in android?为什么将接口作为参数传递给android中的函数?
【发布时间】:2017-08-14 19:04:00
【问题描述】:

在学习 android 中的事件处理时,我遇到了以下代码

我有几个问题

1) 为什么一个匿名类的实例正在实现 View.OnClickListener() 接口作为参数传递给 setOnClickListener()?

2) 将此实例作为参数传递有什么好处?

 Button button    =    (Button) findViewById(R.id.button_send);
 button.setOnClickListener(new View.OnClickListener() // explain this {
 public void onClick(View v) {
    // Do something in response to button click
}});

【问题讨论】:

标签: android interface


【解决方案1】:

目标:您想在用户点击按钮时做某事。

你需要什么:你需要知道用户什么时候点击了按钮。

你怎么知道的: 使用这个View.OnClickListener 接口。

这是View.OnClickListener的源代码:

    /**
     * Interface definition for a callback to be invoked when a view is clicked.
     */
    public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

这就像你将一个方法 A 传递给另一个方法 B,当某个事件发生时,方法 B 调用方法 A。

在这种View.OnClickListener 的情况下,当用户单击按钮时,将调用您传递的方法。

从技术上讲,您实现 View.OnClickListener 并动态创建它的实例并将其传递给方法 setOnClickListener()

onClick(View v) 方法将在用户点击按钮时被调用。因此,只要用户点击按钮,onClick(View v) 方法中的代码就会被执行。

【讨论】:

    【解决方案2】:

    您传递的不是接口 (View.OnClickListener),而是该接口实现实例

    该实例通常是匿名的,因为创建它的命名(可能是最终)实例本质上是无用的;唯一可能使用它的地方是作为单个 setter 的参数。您为创建命名实例而创建的接口的任何实现都可能封装特定于组件的行为,这些行为对于公开为命名类毫无意义。

    this SO answer 对此进行了很好的解释。

    【讨论】:

      猜你喜欢
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多