Android经验Android知识Android内核及各种干货

彻底解决全界面多次点击Button的问题

2016-11-10  本文已影响349人  非墨Zero

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装饰器来解决。

上一篇下一篇

猜你喜欢

热点阅读