java - Android 的 setOnCLickListener() 是如何工作的?

标签 java android

我想知道 Android OnClik Listener 是如何工作的?它是什么模式?观察者?

我无法想象如何在我的应用程序中实现它!它需要是一个自定义实现,因为我想用我的对象而不是 View 来完成它。

那么如何实现调用 obj.setOnClickListener(new Class(){});

在我的代码中?

我的意思是,好吧,我可以在我的基类中拥有一个派生类实现的方法,然后只拥有一个静态 ArrayList 左右。但是如何在运行时将新类添加到此列表中?

这个类 OnClickListener(){} 的定义很奇怪。

如何定义现有类并重写方法?

我的Java不太好,从来没有做过这个...

编辑:这个问题不是关于如何使用 ONCLICKLISTENER。我知道如何使用它...

我想要什么:

我想要一个具有如下方法实现的 super 类:

public void setMyOnclickListener(MyOnClickListener myListener)
{
    //magic code
}

现在我想要一个此类的对象,我们称之为它

Subclass obj;

现在我想这样做:

obj.setMyOnClickLister(new MyOnClickListener()
    {
        //defined method at runtime
        public void aDefinedMethod()
        {
            //here goes in some code
        }
    });

如何才能有一个以类作为参数且仅作为匿名类存在的方法?

编辑2:

好的,我明白了 OnClickListener 只是一个接口(interface) -.- 不是类定义 这就是我的困惑!!!

最佳答案

每个 View 都包含 ListenerInfo 静态类,该类保存回调,OnClickListener 实际上也是如此。

它是如何工作的?

系统始终保留屏幕上的所有 View 。 当用户点击屏幕时,我们有一个递归 foreach 循环:

switch(event) {
    ...
    case ON_CLICK:
    process(ViewRoot);
}

void process(View view) {
    
    for(View view : view.getChilds()) {
        if(view instanceOf ViewGroup && ((ViewGroup)view).getChildCount() > 0) {
             process(view);
        }
        if(view.getListenerInfo().mOnClickListener != null)
             view.getListenerInfo().mOnClickListener.onClick(view)
    }
}

当您调用 setOnClickListener 时,您实际上会说“嘿 Android!这里是回调。当用户点击时,请使用它。”

View.class 还具有返回 ListenerInfo 对象的 getListenerInfo 方法。

系统使用此方法来调度事件。

所以这里没有Observer模式。它只是简单地检查现有回调。

关于java - Android 的 setOnCLickListener() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32884665/

相关文章:

java - 如何跟踪在 MySQL 中加载的源文件?

android - 无法将 Eclipse 中的 ADT 更新到版本 23

android - 根据方向传感器数据旋转图像

java - 我想将图像序列转换为 SD 卡中的视频

java - Google 电子表格的 Maven 依赖项

java - partitioningBy 是否保留原始列表中元素的顺序?

java - 通过 <xsl :param> to <a href>

java - 如何找到通用类型

Android:如何更快地将 1000 个联系人加载并显示到 ListView 中?

android - 导入 Android APK 扩展库错误