深入理解接口的定义和意义

2016-11-11 22:53 阅读 3,419 次 评论 0 条
版权声明:本文著作权归TeachCourse所有,未经许可禁止转载,谢谢支持!
转载请注明出处:http://teachcourse.cn/2077.html

摘要:

Android或Java接口的定义,一直就是一种模糊的状态,简单定义一个接口,然后实现,接口的意义实现事件处理。如何实现事件处理?有两种方式:第一种基于回调机制,第二种基于接口监听,使用接口的目的可以实现类似:OnClickListener、OnLongClickListener、OnItemClickListener、OnHoverListener、OnTouchListener、OnScrollChangedListener等,关于更多View相关的接口,查看开发文档:sdk/docs/reference/android/view/View.OnClickListener.html

一.定义接口

定义接口比较简单,使用interface关键字,然后仅可以声明抽象的方法,接口本身不做任何逻辑处理,暴露在外供“大家”使用,我们使用的是接口的监听机制,监听某个对象设置了接口,获取接口传递过来的数据,最后做逻辑处理,形成了我们熟悉的点击事件、选中事件、长按事件、触摸事件、滑动事件和滚动事件,在重写的抽象方法中执行期待的效果。

这里我们利用View定义好的接口OnClickListener实现一个不是非单击事件的接口监听,目的深入了解接口的特点:一接口是暴露在外共用的东西,二接口监听实现事件处理,查看View.OnClickListener源码,找到OnClickListener接口定义

  1. ...  
  2.   
  3.     /** 
  4.      * Interface definition for a callback to be invoked when a view is clicked. 
  5.      */  
  6.     public interface OnClickListener {  
  7.         /** 
  8.          * Called when a view has been clicked. 
  9.          * 
  10.          * @param v The view that was clicked. 
  11.          */  
  12.         void onClick(View v);  
  13.     }  
  14.   
  15.     ...  

正确使用接口的监听机制,需要完成三个步骤:设置接口,监听接口和实现接口。设置接口对应接口定义的抽象方法onClick(),监听接口对应于setOnClickListener(),实现接口对应于new OnClickListener(){...},你有没有了解错误呢?反正,我在写篇文章之前一直对接口耿耿于怀,总是把握不住它真实的意义和定义。

重写TextView控件,命名为MyTextView,重写TextView的onTouchEvent()方法,然后设置OnClickListener接口,同时进行监听

  1. ...  
  2.   
  3. private OnClickListener mOnClickListener;  
  4.   
  5. public void setmOnClickListener(OnClickListener mOnClickListener) {  
  6.         this.mOnClickListener = mOnClickListener;  
  7.     }  
  8.   
  9. @Override  
  10. public boolean onTouchEvent(MotionEvent event) {  
  11.         mOnClickListener.onClick(this);  
  12.         return super.onTouchEvent(event);  
  13.     }  
  14.   
  15. ...  

期待的效果:触摸MyTextView的时候,监听到接口onClick方法传递当前对象,然后打印当前对象的getText()属性

  1. ...  
  2.   
  3. private void initView() {  
  4.         myTextView = (MyTextView) findViewById(R.id.my_textview);  
  5.         myTextView.setOnTouchListener(new View.OnTouchListener() {  
  6.             @Override  
  7.             public boolean onTouch(View v, MotionEvent event) {  
  8.                 Log.e(TAG, "onTouch: 触摸事件。。。。");  
  9.                 return false;  
  10.             }  
  11.         });  
  12.         /** 
  13.      *区别setOnClickListener和setmOnClickListener 
  14.      */  
  15.         myTextView.setmOnClickListener(new View.OnClickListener() {  
  16.             @Override  
  17.             public void onClick(View v) {  
  18.                 if (v instanceof MyTextView) {  
  19.                     MyTextView view=(MyTextView)v;   
  20.                     Log.e(TAG, "onClick: " +view.getText());  
  21.                 }  
  22.             }  
  23.         });  
  24.     }  
  25.   
  26. ...  

运行Demo的效果,显然实现了自定义的非单击的OnClickListener接口事件监听。证明上面的两个特点:接口是暴露在外共用的东西,二接口监听实现事件处理。例子使用OnClickListener接口,在触摸MyTextView的时候设置接口,然后在MainActivity中调用setmOnClickListener监听,获取MyTextView对象,进行业务处理。
001-how-to-use-interface
忽然发觉以前自己还重新定义类似的OnClickListener、OnItemClickListener接口,现在发觉应该没必要,同理通常源码提供的每个包里都包含预先定义会用到的接口,比如android.widget,android.view,android.view.animation,android.sql.sql等等,几乎都分为接口和类两种,查看地址:sdk/reference/android/view/index.html

利用接口的特性设计优秀的程序

分析:BaseAdapter

1.发现Interface可以继承Interface,然后子接口不需要重写父接口方法

2.BaseAdapter是一个实现ListAdapter和SpinnerAdapter接口的抽象类类,关于抽象类的特点,可以参考《如何重用接口多个抽象方法中的一个或多个?》分析了该类的作用。

3.但是我就不明白了,为什么BaseAdapter的子类还必须要实现getCount(),getView(),getItem()和getItemId()四个抽象方法?

4.原来是因为BaseAdapter间接继承了上述四个方法,并且上述四个方法在BaseAdapter源码中没有实现,根据抽象类的特点即具备接口的特性

5.最后,如果继承了BaseAdapter的类是非抽象类,必须重写上述四个抽象方法。

6.这样写的好处是什么?

(1)基于抽象类回调机制的事件处理,重写的子类MyBaseAdapter的四个方法,刚好覆盖了父类BaseAdapter的方法

(2)四个方法返回适配器需要的数据,设计灵活,可以实现多个子类,返回多种数据形式

(3)符合面向抽象的编程思想,简化并重用代码

关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ1589359239或公众号TeachCourse)
转载请注明出处:http://teachcourse.cn/2077.html
分类:Android 标签:, ,
Android开发之深入理解工厂(Factory)模式 Android开发之深入理解工厂(F
ProgressBar+WebView实现自定义浏览器 ProgressBar+WebView实现自定
Android 开发之深入理解安卓调试桥各种错误解决办法 Android 开发之深入理解安卓调试
什么是淘宝客 淘宝客可以做什么 什么是淘宝客 淘宝客可以做什么

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情