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)解決。