Undertsanding界面如何工作

时间:2016-12-24 16:02:47

标签: android interface onclicklistener

当用户点击视图时,SupplementalInterface方法如何被触发,onClick是一个接口对吗?它没有定义方法的工作方式。

我理解它可以让程序员在调用OnclickListener方法时自由定义它自己的动作,但是当用户点击视图时该方法是如何调用的?当接口中有多个方法时如何工作

据我所知,它比java问题更基本的java问题。但是我很长时间以来都怀疑过这个问题。希望以某种方式解释我是如何运作的。

onClick

3 个答案:

答案 0 :(得分:0)

这是一种回调机制。你需要定义一个实现OnclickListener接口的具体类。这就是你在像这样的

视图上setOnClickListener时所做的
Button button = (Button) findViewById(R.id.button_id);
            button.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // Perform action on click   
                }
            });

您正在定义一个实现OnClickInterface的匿名内部类。 您还可以定义另一个实现OnClickInterface的Custom类,并在setOnClickListener中设置该类。

当您设置监听器时,为了理解您可以看到该按钮将在其中引用您的类

例如:

public class Button extends TextView {
     OnClickInterface mCallBack;

     void setOnClickListener (OnClickInterface in) {
       mCallBack = in;
     }
     void clicked(){
      in.onClick(this);
     }
}

只要单击该按钮,它就会调用接口实现的onclick方法,为其提供视图

希望它有助于

答案 1 :(得分:0)

Java中的接口是一个契约,它包含了希望支持合同的类必须实现的方法的签名。

 public interface OnClickListener 
 {              
      void onClick(View v);
 }

实现OnClickListener的类必须实现方法onClick(View v)。例如 -

public class LogListener implements OnClickListener
{              
    private final Logger logger;

    LogListener(Logger logger) { this.logger = logger; }

    void onClick(View v) { logger.log("View Clicked!"); }
}

无法构造接口,它只能引用接口实现的实例 -

OnClickListener listener = new LogListener(logger);

调用listener.onClick时,引用对象的实现在运行时获取 - 在本例中为LogListener.onClick

Android框架希望支持一种方式,即视图会提示他们已被点击,以便程序员能够处理点击,因此他们提供了一种方法setOnClickListener,可以获取实现OnClickListener的任何对象保留引用对它,当单击按钮时,将调用onClick方法。

此模式称为Observer Pattern

答案 2 :(得分:0)

当我开始学习android时,我遇到了同样的问题。当按下按钮时,我没有直接调用onClick方法。每个东西都是由android完成的。当我们第一次调用setOnclickListener时,它会设置信息监听器。这里有setOnClickListener方法的源代码。

sendmail_path = "sendmail -t -i"

我们有一个方法performAccessibilityActionInternal当我们按下屏幕时调用它,如果动作是单击它将调用performClick方法,这个perfromClick方法将调用监听器的onClick方法 这是performClick方法

 public void setOnClickListener(OnClickListener l) 
 {
     if (!isClickable()) 
    {

         setClickable(true);
     }
     getListenerInfo().mOnClickListener = l;
 }

有关详细信息,请参阅Android开源代码here