摘要:
Android或Java接口的定义,一直就是一种模糊的状态,简单定义一个接口,然后实现,接口的意义实现事件处理。如何实现事件处理?有两种方式:第一种基于回调机制,第二种基于接口监听,使用接口的目的可以实现类似:OnClickListener、OnLongClickListener、OnItemClickListener、OnHoverListener、OnTouchListener、OnScrollChangedListener等,关于更多View相关的接口,查看开发文档:sdk/docs/reference/android/view/View.OnClickListener.html
一.定义接口
定义接口比较简单,使用interface关键字,然后仅可以声明抽象的方法,接口本身不做任何逻辑处理,暴露在外供“大家”使用,我们使用的是接口的监听机制,监听某个对象设置了接口,获取接口传递过来的数据,最后做逻辑处理,形成了我们熟悉的点击事件、选中事件、长按事件、触摸事件、滑动事件和滚动事件,在重写的抽象方法中执行期待的效果。
这里我们利用View定义好的接口OnClickListener实现一个不是非单击事件的接口监听,目的深入了解接口的特点:一接口是暴露在外共用的东西,二接口监听实现事件处理,查看View.OnClickListener源码,找到OnClickListener接口定义
- ...
- /**
- * Interface definition for a callback to be invoked when a view is clicked.
- */
- public interface OnClickListener {
- /**
- * Called when a view has been clicked.
- *
- * @param v The view that was clicked.
- */
- void onClick(View v);
- }
- ...
正确使用接口的监听机制,需要完成三个步骤:设置接口,监听接口和实现接口。设置接口对应接口定义的抽象方法onClick(),监听接口对应于setOnClickListener(),实现接口对应于new OnClickListener(){...},你有没有了解错误呢?反正,我在写篇文章之前一直对接口耿耿于怀,总是把握不住它真实的意义和定义。
重写TextView控件,命名为MyTextView,重写TextView的onTouchEvent()方法,然后设置OnClickListener接口,同时进行监听
- ...
- private OnClickListener mOnClickListener;
- public void setmOnClickListener(OnClickListener mOnClickListener) {
- this.mOnClickListener = mOnClickListener;
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- mOnClickListener.onClick(this);
- return super.onTouchEvent(event);
- }
- ...
期待的效果:触摸MyTextView的时候,监听到接口onClick方法传递当前对象,然后打印当前对象的getText()属性
- ...
- private void initView() {
- myTextView = (MyTextView) findViewById(R.id.my_textview);
- myTextView.setOnTouchListener(new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- Log.e(TAG, "onTouch: 触摸事件。。。。");
- return false;
- }
- });
- /**
- *区别setOnClickListener和setmOnClickListener
- */
- myTextView.setmOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (v instanceof MyTextView) {
- MyTextView view=(MyTextView)v;
- Log.e(TAG, "onClick: " +view.getText());
- }
- }
- });
- }
- ...
运行Demo的效果,显然实现了自定义的非单击的OnClickListener接口事件监听。证明上面的两个特点:接口是暴露在外共用的东西,二接口监听实现事件处理。例子使用OnClickListener接口,在触摸MyTextView的时候设置接口,然后在MainActivity中调用setmOnClickListener监听,获取MyTextView对象,进行业务处理。
忽然发觉以前自己还重新定义类似的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)符合面向抽象的编程思想,简化并重用代码
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/2077.html ,谢谢支持!