Android自定义事件监听器

51

如果我想为我的类创建自己的事件监听器,我该如何做?我需要手动维护线程吗?


3
请参考CodePath主题创建自定义监听器 - Suragch
3个回答

130
public class CustomView extends View(){
OnCustomEventListener mListener;
:
://some code
:
:
创建一个接口,该接口将由您的活动实现:
public interface OnCustomEventListener {
    void onEvent();
}

public void setCustomEventListener(OnCustomEventListener eventListener) {
    mListener = eventListener;
}

现在你需要知道事件实际发生的时间。例如,当用户触摸屏幕上的某一个点时,需要重写 onTouchEvent 方法:

onTouchEvent(MotionEvent ev) {
    if (ev.getAction==MotionEvent.ACTION_DOWN) {
        if(mListener!=null) 
            mListener.onEvent();
    }
}

同样地,你可以创建你想要的特定事件(例如点击、等待2秒钟后释放——你需要在触摸事件内部执行一些逻辑)。

在你的活动中,你可以使用customView对象来设置事件监听器,如下:

 customView.setCustomEventListener(new OnCustomEventListener() {
    public void onEvent() {
        //do whatever you want to do when the event is performed.
    }
 });   

OnCustomEventListener接口定义中的圆括号是打错了吗? - Jacob Wan
rDroid,感谢提供示例!OnCustomEventListener接口应该在CustomView类内部还是外部声明? - Brabbeldas
通常接口是在视图类中声明的。 - rDroid
抱歉晚问,但我不明白setCustomEventListener的目的,你在代码中没有调用这个函数。 - user4409899
@killerprince182,你使用了一个匿名类来设置CustomEventListener,这个匿名类的类型是OnCustomEventListener(一个接口),它要求你实现onEvent函数。这个匿名类被分配给CustomView中的mListener。每当mListener.onEvent()被触发时,Activity中实现的OnEvent函数将被执行。 - hjchin
谢谢。非常有帮助! - Steven

21

以下是完成的方法:

首先创建一个接口类:

public interface OnStopTrackEventListener {
    public void onStopTrack();
}

然后创建控制界面的类:

public class Player {

    private OnStopTrackEventListener mOnStopTrackEventListener;

    public void setOnStopTrackEventListener(OnStopTrackEventListener eventListener)
    {
        mOnStopTrackEventListener = eventListener;
    }

    public void stop()
    {
        if(mOnStopTrackEventListener != null)
        {
            mOnStopTrackEventListener.onStopTrack();
        }

    }
}

就这些。现在让我们使用它。

Player player = new Player();
player.stop(); //We are stopping music
player.setOnStopTrackEventListener(new OnStopTrackEventListener() {
      @Override
      public void onStopTrack() {
           //Code to work when music stops
      }
});

是的,非常简单易懂的代码。只需要进行一次编辑。请使用以下序列来避免空指针异常。Player player = new Player(); player.stop(); //我们正在停止音乐 player.setOnStopTrackEventListener(new OnStopTrackEventListener() { @Override public void onStopTrack() { //音乐停止时要执行的代码 } }); - Ramkesh Yadav

2
我发现这篇教程非常有用。它解释了使用自定义监听器来管理代码中回调的四个步骤:
1.定义一个接口作为事件协议,其中方法定义了事件和相关事件数据的参数。
2.在子对象中设置侦听器成员变量和setter,可以分配接口的实现。
3.所有者传递实现接口并处理子对象事件的侦听器。
4.当对象想要将事件通信给所有者时,在定义的侦听器上触发事件。
希望对你有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接