针对事件的Android自定义侦听器
我正在尝试在更新整数值时触发事件,但它失败了。 这是我正在使用的代码:
声明自定义侦听器
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:尝试在null对象引用上调用接口方法’void alveare.com.plcsignalconverter.fieldactivity $ OnModeUpdate.onEvent()’
有什么我想念的吗?
NullPointerException是由null referenc对象调用方法引起的,该对象是一个尚未初始化的对象。
在您的情况下,null对象是modeUpdate
。 尝试在活动的onCreate()
中初始化它。
modeupdate = new OnModeUpdate() { @Override public void onEvent() { /** * Write the code to handle the case */ } };
监听器的更通用名称是观察者 *设计模式。 说到模式术语,你想要实现的是使观察者,即模式modeupdate
,在可观察对象内发生事件(整数值变化)时得到通知,即与用户交互的fieldactivity
。
观察者modeupdate
可以是任何类型,并且必须实现OnModeUpdate
接口才能从可观察对象接收通知。 例如**
public class CustomListener implements OnModeUpdate { @Override public void onEvent() { ... } }
现在,您可以通过以下选项之一(根据您的业务逻辑)在可观察对象( fieldactivity
)中分配观察者( modeupdate
):
-
使用“外部”类实例初始化
modeupdate
OnModeUpdate modeupdate = new CustomListener();
-
使用
modeupdate
类中的匿名内部类实例初始化modeupdate
modeupdate = new OnModeUpdate() { @Override public void onEvent() { // Do stuff regarding the mode change } };
-
通过在对
fieldactivity
实例***的引用上调用setModeupdate(...)
,从fieldactivity
类外部分配modeupdate
。
上面说明了NullPointerException
的原因。 你从未初始化modeupdate
。 在初始化modeupdate
, onEvent()
方法将在单击按钮时触发。
注意:您在注释中写入了代码: “// BreakPoint在这里,但永远不会到达。” 它不能在接口声明中到达,只能在实现接口的对象的实例上到达。
*模式的另一个名称是Subscriber-Publisher模式。
**如果在fieldactivity中声明了OnModeUpdate接口,则使用公共类CustomListener实现fieldactivity.OnModeUpdate
***与通过调用Button类之外的setOnClickListener()并分配侦听器(即实现View.OnClickListener接口的对象( fieldactivity ))对按钮变量的操作相同