对android中回调的理解

来源:互联网 发布:linux中竖线 命令 编辑:程序博客网 时间:2024/06/06 01:39

一直对android中怎么实现回调不是很理解,最近看了一些源码,总结一下实现方法

回调 其实就是我在activity中实现在view中已经定义好的接口,并且重写接口定义的方法,在方法中实现你想做的动作。至于什么时候去触发这个接口中的方法在view中定义。

这样他们就实现了 触发操作和 自定义触发结果的分离。例如他在view中定义了一个点击事件那么你要使用这个view就可以调用这个点击事件的结果这个触发的动作是在view中定义好的。但是他不实现触发这个点击后要实现什么效果这个他要求你去实现,而实现方法就是你在activity中去实现这个接口然后实现接口提供的方法,view中一般会有一个方法去初始化view中这个接口然后要求你在activity中实现 例如 MyVeiw.setOnClickListener(this);这样你就为view中这个接口初始化了。这个实例其实就是实现接口的activity,view就可以定义在什么情况下触发这个接口中的方法了。

说了很多不知道能不能看懂还是使用代码展示一下吧:



public class MyLayout extends ViewGroup {// Event listenersprivate OnItemClickListener mOnItemClickListener = null; @Overridepublic boolean onSingleTapUp(MotionEvent e) {mTappedViewsPostition = pointToPosition(e.getX(), e.getY());if (mTappedViewsPostition >= 0) {mTappedView = getChildAt(mTappedViewsPostition);mTappedView.setPressed(true);} else {float centerX = circleWidth / 2;float centerY = circleHeight / 2;if (e.getX() < centerX + (childWidth / 2)&& e.getX() > centerX - childWidth / 2&& e.getY() < centerY + (childHeight / 2)&& e.getY() > centerY - (childHeight / 2)) {if (mOnCenterClickListener != null) {mOnCenterClickListener.onCenterClick();return true;}}}if (mTappedView != null) {CircleImageView view = (CircleImageView) (mTappedView);if (selected != mTappedViewsPostition) {rotateViewToCenter(view, false);if (!rotateToCenter) {if (mOnItemSelectedListener != null) {mOnItemSelectedListener.onItemSelected(mTappedView,mTappedViewsPostition, mTappedView.getId(),view.getName());}if (mOnItemClickListener != null) {mOnItemClickListener.onItemClick(mTappedView,mTappedViewsPostition, mTappedView.getId(),view.getName());}}} else {rotateViewToCenter(view, false);if (mOnItemClickListener != null) {mOnItemClickListener.onItemClick(mTappedView,mTappedViewsPostition, mTappedView.getId(),view.getName());}}return true;}return super.onSingleTapUp(e);}} public void setOnItemClickListener(OnItemClickListener onItemClickListener) {this.mOnItemClickListener = onItemClickListener;}public interface OnItemClickListener {void onItemClick(View view, int position, long id, String name);} 

MyLayout中定义了一个OnItemClikListener接口,并提供一个onItemClick方法这个方法。在这个类对这个接口初始化了一个对象但是没有实例化。但是他提供了一个实例化的方法 setOnItemClickListener(OnItemClickListener);还有就是在方法OnSingTapUp中调用了这个方法。你肯定很疑惑,接口的方法是没有实现的那 调用有什么用呢?其实他是想让我们在其他地方实现。

下面是实现他的activity中实现了这个接口

public class MainActivity extends Activity implements OnItemSelectedListener,OnItemClickListener {TextView selectedTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);MyLayout myMenu = (CircleLayout) findViewById(R.id.main_my_layout);myMenu.setOnItemSelectedListener(this);myMenu.setOnItemClickListener(this);// 初始化view中的接口selectedTextView = (TextView) findViewById(R.id.main_selected_textView);selectedTextView.setText(((CircleImageView) myMenu.getSelectedItem()).getName());Object obj = new Object();}@Overridepublic void onItemSelected(View view, int position, long id, String name) {selectedTextView.setText(name);}        //现实接口中的方法@Overridepublic void onItemClick(View view, int position, long id, String name) {Toast.makeText(getApplicationContext(),getResources().getString(R.string.start_app) + " " + name,Toast.LENGTH_SHORT).show();}}

好像看是简单,但是理解起来还是有点难如果没有实例的话。这种设计在android中到处都是如果不理解对写代码还是有困难不知道为什么要这么做,细想一下这中回调的设计其实是很好的。我们应该学习在以后写代码的时候可以试试。

原创粉丝点击