徹底解決全界面多次點(diǎn)擊Button的問(wèn)題

MultiClickInterapterFactory###

GitHub 地址:<a >PopupWindowFragment</a>

Bug反饋地址: dingwei.chen1988@gmail.com

這個(gè)類是為了解決頻繁點(diǎn)擊控件而造成的業(yè)務(wù)問(wèn)題。為了解決這個(gè)問(wèn)題你只需要生成一個(gè)MultiClickInterapterFactory對(duì)象,并在你的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);
    }

這樣就解決了這個(gè)界面內(nèi)部所有的Button控件,還有TextView控件的click的監(jiān)控工作。

主要原理###

Android系統(tǒng)的布局xml模型到Java對(duì)象的映射,是依賴于LayoutInflater服務(wù)來(lái)攔截的,而在LayoutInflater的轉(zhuǎn)換過(guò)程中,抽象出了一個(gè)叫做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);
    }

這兩個(gè)接口的主要差別在于接口方法的個(gè)數(shù),而接口的目的是為了攔截一些處理操作。比如在Android系統(tǒng)中的fragment標(biāo)簽的映射,還有一些主題控件的替換等等。默認(rèn)情況下,LayoutInflater.Factory2的實(shí)現(xiàn)類就是你的Activity。比如Android在處理fragment標(biāo)簽的時(shí)候?qū)嶋H上就是在Activity方法中進(jìn)行的。

//code Activity
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
        if (!"fragment".equals(name)) {
            return onCreateView(name, context, attrs);
        }
...
}

因此我們?cè)谧鯿lick事件攔截的時(shí)候,我們只需要將我們的攔截控件替換掉原來(lái)的非攔截控件就好了。MultiClickInterapterFactory就是做了這件事情。
但是這么做有什么問(wèn)題呢?我們知道這樣可以解決xml布局到Java對(duì)象的映射問(wèn)題,但是無(wú)法處理代碼中生成控件的問(wèn)題。為了更好的降低代碼侵入性,因此,非墨還增加了MultiClickInterapterWarpperListener這個(gè)裝飾器類,用來(lái)處理代碼中,生成控件的點(diǎn)擊問(wèn)題。

有什么問(wèn)題么?###

上面提到,有些系統(tǒng)主題會(huì)替換掉原來(lái)的控件,也就是說(shuō)在LayoutInflater里面優(yōu)先做的攔截,這種情況下,很多的控件是無(wú)法傳遞到Activity的。這種情況下,只能通過(guò)上述的Listener裝飾器來(lái)解決。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,841評(píng)論 25 708
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,497評(píng)論 0 17
  • 如何使用Java生成Word文檔呢?基本的想法就是使用一個(gè)現(xiàn)成的Word作為模版,需要用變量替換的地方,在word...
    吳摩西閱讀 6,288評(píng)論 0 2
  • 晴空萬(wàn)里無(wú)片云,清波碧柳暖風(fēng)吹。 麥田悠悠雀飛高,自是春光無(wú)限好。 本該高歌應(yīng)此景,只是此景勿此時(shí)。 眼望遠(yuǎn)處心中...
    張小小渣閱讀 240評(píng)論 1 1
  • 古今漫游似仙, 萬(wàn)里碧空云卷。 玄機(jī)悟不斷, 山水胸中輪轉(zhuǎn)。 修煉, 修煉, 只求今生無(wú)憾!
    鴻蒙一葉閱讀 295評(píng)論 1 4