前言
在Android中,我们往往会在自定义dialog中进行一些点击事件的监听,而我们大多数是采用设置一个监听接口的方式,将点击事件回调给外部的Activity中进行处理。然而如果我们有多个Dialog,那么每个Dialog我们是不是都需要定义一个监听器接口来处理相关事件的监听,这样的话会导致监听接口后期的维护成本较高,因此封装一个足够通用的监听器是可以有效提高开发效率的。
常规方法
正常我们在Dialog中实现对某个点击事件的监听,应该类似如下代码
public interface OnClickListener{
void onClick();
}
private OnClickListener onClickListener;
public void setOnClickListener(OnClickListener listener){
onClickListener = listener;
}
在控件的点击事件下添加
if(null != onClickListener){
onClickListener.onClick();
}
最后在外部Activity中给dialog设置监听器便可以实现。
mDialog.setOnClickListener(new OnClickListener(){
@Override
public void onClick(){
//此处处理点击事件
}
});
然而,这样做的话我们如果在点击事件中要添加参数,例如加多一个String的参数,那么我们便需要将onClick()改为onClick(String str),这样的话其实对后期维护的话不太方便,特别是代码量大的情况。另外每一个Dialog定义一个监听接口,这样改起来也会很麻烦,最好的方法就是封装一个足够通用的监听器,这样的话能大大提高我们的开发效率。
通用封装
我们可以在接口的抽象方法中增加几个参数,添加后如下
public interface OnClickListener{
void onClick(int type, String msg, DataEntity entity);
}
下面我来说一下这几个参数代表的含义:type代表的是事件类型,因为每一个控件点击时触发的是不同的事件,那么我们可以将每一个事件都用一个类型来表示;msg这个参数只是单纯作为一个标记,使自己知道这个点击事件的具体作用;而entity代表保存的数据,我们可以将数据以hashmap的形式保存到entity中。
DataEntity这个类可以这样写:
public class DataEntity{
privatet final private Map<String,String> mapStr = new LinkedHashMap<>();
public String get(String key){
return mapStr.get(key);
}
public void putStr(String key,String value){
mapStr.put(key,value);
}
}
大概是这个样子,具体还是得自己想想怎么写比较好,这里只是供大家作一个参考。
这样的话方法的调用可以这样写:
if(null != onClickListener){
DataEntity entity = new DataEntity();
entity.put("key","value");
int type = 0;
onClickListener.onClick(type,"点击事件",entity);//type可以在一个枚举类中定义一系列点击事件的类型
}
在外部的处理是这样的:
mDialog.setOnClickListener(new OnClickListener(){
@Override
public void onClick(int type,String msg,DataEntity entity){
//此处处理点击事件
if(type == 0){
String value = entity.get("key");
}else{
}
}
});
这样的话我们如果需要增加或者删减参数只需要对entity进行修改,并不需要改到监听器的方法,可以使维护难度大大降低。
总结
以上就是Android中通用监听器封装的一个思路,这也是我最近刚学到的方法,觉得特别有用,所以想跟大家一起分享,具体的实现大家可以自己想想怎么封装会更好,更有利于开发。