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 自定义事件监听器的主要内容,如果未能解决你的问题,请参考以下文章