Android的按钮监听事件&自定义回调函数
在写代码时总是要用上回调函数,一直都是把怎么用背下来,没有很好理解,今天下决心查阅资料加上平时写的代码,梳理一番
我们先来看Button的监听机制:android对一些imageView,Button等组件设置了监听机制,当我们对组件进行点击时,回调onClick方法:
//第一种方式
Button Btn1 = (Button)findViewById(R.id.button1);//获取按钮资源
Btn1.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
String strTmp = "点击Button01";
Ev1.setText(strTmp);
}
});
//第二种方式
Button Btn2 = (Button) findViewById(R.id.button2);//获取按钮资源
Btn2.setOnClickListener(listener);//设置监听
}
//此类实现implements View.OnClickListener,回调onClick方法
@override
public void onClick(View v){
String strTmp="点击Button02";
Ev1.setText(strTmp);
}
接下来我们来看自定义回调函数怎么实现,在我的代码经验中,回调用得最多的时候有俩种:1.自定义View的UI类中定义接口,设置方法把接口暴露给调用者。2.在写RecyclerView时,在其适配器中对其Item(理解为每一行)的组件进行监听,或是对整个Item进行监听。接下来我们看这俩种实现:
//第二种实现
private OnCampaignClickListener mListener;
//定义接口,不考虑方法实现,方法实现由调用者去考虑
public interface OnCampaignClickListener{
void onClick(View view,Campaign campaign);
}
//暴露一个方法给调用者来注册接口回调,通过接口来获得回调者对接口方法的实现
public void setOnCampaignClickListener(OnCampaignClickListener listener){
this.mListener = listener;
}
imageViewBig.setOnClickListener(this);
imageViewSmallTop.setOnClickListener(this);
imageViewSmallBottom.setOnClickListener(this);
//对这些组件的点击事件设置点击效果
@Override
public void onClick( View v) {
anim(v);
}
//**为三个组件添加点击事件,调用接口中的方法,待需要回调时,会有具体的实现**
private void anim(final View v){
//通过ObjectAnimator设置动画属性
ObjectAnimator animator = ObjectAnimator.ofFloat(v,"rotationX",0.0F,360.0F)
.setDuration(200);
animator.addListener(new AnimatorListenerAdapter() {
//动画效果结束后回调
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
HomeCampaign homeCampaign = mDatas.get(getLayoutPosition());
if(mListener !=null){
switch (v.getId()){
case R.id.imgview_big:
mListener.onClick(v,homeCampaign.getCpOne());
break;
case R.id.imgview_small_top:
mListener.onClick(v,homeCampaign.getCpTwo());
break;
case R.id.imgview_small_bottom:
mListener.onClick(v,homeCampaign.getCpThree());
break;
}
}
}
});
animator.start();
}
}
**实现接口回调**
**调用者需要实现接口,完成接口的方法,将接口对象传入到被调用者暴露出来的注册方法中,从而完成回调**
//对商品拥有点击事件,跳转到WareListActivity
mAdatper.setOnCampaignClickListener(new HomeCatgoryAdapter.OnCampaignClickListener() {
@Override
public void onClick(View view, Campaign campaign) {
Intent intent = new Intent(getContext(), WareListActivity.class);
//把value值传入intent,key需要用常量来标记
intent.putExtra(Constants.COMPAINGAIN_ID,campaign.getId());
startActivity(intent);
}
});
下面对回调这个概念进行总结,所谓回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体实现,需要B类去实现,B类实现该方法后,本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调。
最近压力较大,结尾传递个正能量,只要努力,默默耕耘,必有成就!