彻底解决全界面多次点击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装饰器来解决。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,776评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,827评论 0 17
  • 如何使用Java生成Word文档呢?基本的想法就是使用一个现成的Word作为模版,需要用变量替换的地方,在word...
    吴摩西阅读 11,527评论 0 2
  • 晴空万里无片云,清波碧柳暖风吹。 麦田悠悠雀飞高,自是春光无限好。 本该高歌应此景,只是此景勿此时。 眼望远处心中...
    张小小渣阅读 1,612评论 1 1
  • 古今漫游似仙, 万里碧空云卷。 玄机悟不断, 山水胸中轮转。 修炼, 修炼, 只求今生无憾!
    鸿蒙一叶阅读 2,361评论 1 4