您的位置:首页 > 移动开发 > Android开发

Java回调机制(以Android事件监听器为例)

2016-02-25 17:50 429 查看
Java的设计模式中有回调这个机制,在Android开发中我们也会经常用到回调机制。下面就通过一些小例子来说明什么是回调。

假如我们要实现这个这样一个功能。
MainActivity中由一个Fragment和一个ViewPager构成,Fragment中有一系列按钮,通过按下这些按钮可以来切换ViewPager的当前页卡,一般我们会这么实现。
首先在Fragment中获得MainActivity。
private MainActivity activity;//Frgament的成员变量
@Override
public void onStart() {//Fragment的onStart方法
super.onStart();
activity = (MainActivity) getActivity();
}


然后再Fragment中的button的点击事件中,获取activity中的ViewPager实例,然后执行setcurrentItem()方法。
mViewHolder.item1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activity.mViewPager.setCurrentItem(2);
}
});


这样做我们就实现了功能。
接下来,同样的功能,我们如果使用回调机制的话。是这样实现的。
首先写一个接口。
public interface OnToolBarSelectListener {
public void onSelect(int postion);
}


看名字就知道了,在按钮按下的时候的监听器。
然后在MainActivity中实现这个接口。
public class MainActivity extends Activity implements OnToolBarSelectListener {
private Context mContext;
private ViewPager mViewPager;
private ToolBarFragment toolBarFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
}
@Override
public void onSelect(int position) {
mViewPager.setCurrentItem(position);
}

}


同时在Fragment中,我们要获取MainActivity。同时在控件的点击事件中执行接口中的方法。

public class ToolBarFragment extends BaseFragment implements OnViewPagerSlideListener {

private MainActivity activity;
private OnToolBarSelectListener mOnToolBarSelectListener;

public void setOnToolBarSelectListener(OnToolBarSelectListener mOnToolBarSelectListener) {
this.mOnToolBarSelectListener = mOnToolBarSelectListener;
}

@Override
public void onStart() {
super.onStart();
this.setOnToolBarSelectListener((MainActivity) getActivity());
mViewHolder.item1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnToolBarSelectListener.onSelect(1);
}
});
}
}


首先MainActivity实现了接口,然后在onSelect方法中做好点击之后要做的事情。
然后在Fragment中,获得这个接口的实例,并在相应的地方处理(点击事件监听中)。
在本例中,其实OnToolBarSelectListener是没有必要写set方法的,因为直接就在Frgament中处理了,但是如果需要换别的地方处理,一个set方法可以让你的程序更有条理。
后面的解决方案在当前需求的情况下,的确有些画蛇添足了。
但是这样的做法的确是遵循了JAVA的设计模式,在需求情况比较复杂的情况下这么写,代码的维护性会很高。

参考:http://blog.csdn.net/xiaanming/article/details/8703708/ http://blog.csdn.net/pi9nc/article/details/23169357
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: