彻底解决全界面多次点击Button的问题
MultiClickInterapterFactory###
GitHub 地址:<a href="https://github.com/FeiMo1988/PopupWindowFragment">PopupWindowFragment</a>
Bug反馈地址: dingwei.chen1988@gmail.com
这个类是为了解决频繁点击控件而造成的业务问题。为了解决这个问题你只需要生成一个MultiClickInterapterFactory对象,并在你的Activity的onCreateView方法中加入3行的代码。
//Code your Activity:
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
//add interapter begin
View view = mFactory.onCreateView(name,context,attrs);
if (view != null) {
return view;
}
// add interapter end
return super.onCreateView(parent, name, context, attrs);
}
这样就解决了这个界面内部所有的Button控件,还有TextView控件的click的监控工作。
主要原理###
Android系统的布局xml模型到Java对象的映射,是依赖于LayoutInflater服务来拦截的,而在LayoutInflater的转换过程中,抽象出了一个叫做LayoutInflater.Factory2和LayoutInflater.Factory的接口。
public interface Factory {
public View onCreateView(String name, Context context, AttributeSet attrs);
}
public interface Factory2 extends Factory {
public View onCreateView(View parent, String name, Context context, AttributeSet attrs);
}
这两个接口的主要差别在于接口方法的个数,而接口的目的是为了拦截一些处理操作。比如在Android系统中的fragment标签的映射,还有一些主题控件的替换等等。默认情况下,LayoutInflater.Factory2的实现类就是你的Activity。比如Android在处理fragment标签的时候实际上就是在Activity方法中进行的。
//code Activity
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
if (!"fragment".equals(name)) {
return onCreateView(name, context, attrs);
}
...
}
因此我们在做click事件拦截的时候,我们只需要将我们的拦截控件替换掉原来的非拦截控件就好了。MultiClickInterapterFactory就是做了这件事情。
但是这么做有什么问题呢?我们知道这样可以解决xml布局到Java对象的映射问题,但是无法处理代码中生成控件的问题。为了更好的降低代码侵入性,因此,非墨还增加了MultiClickInterapterWarpperListener这个装饰器类,用来处理代码中,生成控件的点击问题。
有什么问题么?###
上面提到,有些系统主题会替换掉原来的控件,也就是说在LayoutInflater里面优先做的拦截,这种情况下,很多的控件是无法传递到Activity的。这种情况下,只能通过上述的Listener装饰器来解决。