接口可以声明在任意包下的任意地方,符合语法就可以,点击事件监听接口声明在View类内部 接口声明在哪里不重要,没影响
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource { public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); } }在被监听的对象(类)内部提供接口对象作为其属性 给触发监听事件的对象提供接口对象属性,方面后面执行接口的方法,在这个方法传入实际参数。
public OnClickListener mOnClickListener; public void setOnClickListener(@Nullable OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; }在需要接口回调的类执行setOnClickListener(OnClickListener onClickListener){} 需要回调接口的地方设置监听 或者实现接口
public abstract class BaseActivity extends AppCompatActivity implements OnClickListener {} public class RegisterActivity extends BaseActivity { // 接口的回调方法 public void onClick(View v) { } }接口声明 声明在Test类下
package com.richard.learn; public class Test { // 接口声明 public interface TestListener{ void getNumber(int number); } }在被监听对象能访问到的地方提供接口对象属性,并设置set方法 MakeNumber 是被监听的对象(触发监听事件的对象),由这个对象提供接口中方法形参的实际参数。
package com.richard.learn; public class MakeNumber { // 待传入接口方法的数据来源 实际编程获取接口方法形参对应的实参没这么简单 int number = 20; Test.TestListener testListener; public void setTestListener(Test.TestListener testListener) { if (testListener!=null){ // 如果接口对象不是null 把参数传入接口中的方法 testListener.getNumber(number); } } }回调方法的使用 ShowNumber 类作为回调方法的使用类(哪个类使用原理一样):提供监听对象(作用:调用接口中的方法,也就是setTestListener()),提供监听接口对象实例(可以是接口实现类或接口实现类的子类或者直接new 一个匿名内部类),重写接口的方法(回调的目的就是为了获取接口中方法的参数,从而做点别的事)
package com.richard.learn; public class ShowNumber implements Test.TestListener { /** * 接口回调方法 * @param number */ @Override public void getNumber(int number) { System.out.println(20); } public static void main(String[] args) { new MakeNumber().setTestListener(new ShowNumber()); } }运行结果
