Android 自定义事件监听器

Posted

技术标签:

【中文标题】Android 自定义事件监听器【英文标题】:Android custom listener for an event 【发布时间】:2017-02-18 07:27:04 【问题描述】:

我试图在更新整数值时触发一个事件,但它失败了。这是我正在使用的代码:

声明自定义监听器

public class fieldactivity extends AppCompatActivity implements View.OnClickListener 
    OnModeUpdate modeupdate; //Create custom listener for mode update

    int mode = 1;

模式更新代码

 protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fieldsignals);
        Button button = (Button) findViewById(R.id.mode_rotate_button);
        button.setOnClickListener(this);
    

 @Override
    public void onClick(View v) 
        switch (v.getId()) 
            case(R.id.rotate_button):
                mode += 1;
                modeupdate.onEvent(); //Fire Custom Lisentener - Fails On This Line
        

    

接口代码

public interface OnModeUpdate 
//BreakPoint here, but is never reached
        void onEvent();
    

    public void setModeupdate(OnModeUpdate eventListener) 
        modeupdate = eventListener;
    

我得到的错误是:

java.lang.NullPointerException:尝试调用接口方法 '空白 alveare.com.plcsignalconverter.fieldactivity$OnModeUpdate.onEvent()' 在空对象引用上

我有什么遗漏吗?

【问题讨论】:

你从未初始化过modeupdate。您可以查看 this answer 以了解该模式的工作原理。 你应该在一些活动中实现 OnModeUpdate 并在 onEvent() 方法中定义要做什么 你从未调用过setModeupdate,也从未实现过接口 【参考方案1】:

NullPointerException是在一个空引用的对象上调用方法引起的,也就是说它没有被初始化。

在您的情况下,空对象是modeUpdate。尝试在您的活动的onCreate() 中初始化它。

modeupdate = new OnModeUpdate() 
    @Override
    public void onEvent() 
      /**
      * Write the code to handle the case
      */
    
;

【讨论】:

【参考方案2】:

listener 的更通用名称是 observer * 设计模式。说到模式术语,您想要实现的是让观察者(即modeupdate)在可观察对象(即fieldactivity与用户交互)内发生事件(整数值更改)时得到通知。

观察者modeupdate 可以是任何类型,并且必须实现OnModeUpdate 接口才能接收来自可观察对象的通知。例如**

public class CustomListener implements OnModeUpdate 
    @Override
    public void onEvent() 
        ...
    

现在您可以通过以下选项之一(根据您的业务逻辑)在可观察对象 (fieldactivity) 中分配观察者 (modeupdate):

用“外部”类实例初始化modeupdate

OnModeUpdate modeupdate = new CustomListener();

使用fieldactivity 类中的匿名内部类实例初始化modeupdate

modeupdate = new OnModeUpdate() 
    @Override
    public void onEvent() 
        // Do stuff regarding the mode change
    
;

通过在 fieldactivity 实例 *** 的引用上调用 setModeupdate(...)fieldactivity 类的外部分配 modeupdate

以上解释了NullPointerException的原因。你从未初始化过modeupdate。在modeupdate 初始化后,onEvent() 方法将在按钮点击时被触发。

注意:您在代码的注释中写道:“... BreakPoint here,但从未到达。” 在接口声明中无法到达,仅在实现该接口的对象的实例上。


* 模式的另一个名称是订阅者-发布者模式。 ** 如果在 fieldactivity 中声明了 OnModeUpdate 接口,则使用 公共类 CustomListener 实现 fieldactivity.OnModeUpdate sup> *** 与您对 button 变量所做的相同,方法是在 Button 类之外调用 setOnClickListener()并分配一个监听器,即实现View.OnClickListener接口的对象(fieldactivity

【讨论】:

以上是关于Android 自定义事件监听器的主要内容,如果未能解决你的问题,请参考以下文章

Android 应用上的自定义事件监听器

RecycleView的使用+自定义监听事件

js怎么自定义事件,并能让用on事件监听

java 自定义事件的触发及监听

创建自定义事件

mui.fire()触发自定义事件