之前用java使用Butterknife時(shí)設(shè)置點(diǎn)擊方式是這樣子的:
@OnClick({R.id.xxxx1, R.id.xxxx2, R.id.xxxx3})
public void onViewClicked(View v) {
switch (v.getId()) {
case R.id.xxxx1:
...
break;
case R.id.xxxx2:
...
break;
case R.id.xxxx3:
...
break;
}
}
因?yàn)楝F(xiàn)在都用Kotlin語(yǔ)言了,Butterknife的作用就不是很大氨淌,顯得雞肋泊愧,但是如果不用Butterknife的話那點(diǎn)擊事件該怎么搞呢?
思考了一番盛正,根據(jù)Butterknife的風(fēng)格我寫了一個(gè)頂級(jí)拓展函數(shù)具體如下:
/**
* 設(shè)置點(diǎn)擊事件
* @param views 需要設(shè)置點(diǎn)擊事件的view
* @param onClick 點(diǎn)擊觸發(fā)的方法
*/
fun setOnclick(vararg views: View?, onClick: (View) -> Unit) {
views.forEach {
it?.setOnClickListener { view ->
onClick.invoke(view)
}
}
}
大概流程就是根據(jù)傳入的可變數(shù)量的views删咱,循環(huán)給他們?cè)O(shè)置點(diǎn)擊事件,觸發(fā)點(diǎn)擊時(shí)豪筝,調(diào)用onClick方法回調(diào)
然后在BaseActivity/BaseFragment(你的基類)定義一個(gè)方法:
open fun onViewClicked(){}
在BaseActivity onCreate() / BaseFragment onViewCreated()時(shí)調(diào)用該方法
activity:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
onViewClicked()
}
fragment:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
...
onViewClicked()
}
最后Activity/Fragment使用時(shí)如果需要設(shè)置點(diǎn)擊事件可以重寫 onViewClicked 方法調(diào)用拓展函數(shù)setOnclick方法痰滋,傳入你要設(shè)置點(diǎn)擊事件的view :
override fun onViewClicked() {
setOnclick(xxxx1,xxxx2,xxxx3){
when(it.id){
R.id.xxxx1 ->{
...
}
R.id.xxxx2 ->{
...
}
R.id.xxxx3 ->{
...
}
}
}
}
拓展:既然決定這么設(shè)置點(diǎn)擊事件的話摘能,我們也可以順便整整防止重復(fù)點(diǎn)擊事件
添加頂級(jí)拓展函數(shù):
/**
* 設(shè)置防止重復(fù)點(diǎn)擊事件
* @param views 需要設(shè)置點(diǎn)擊事件的view
* @param interval 時(shí)間間隔 默認(rèn)0.3秒
* @param onClick 點(diǎn)擊觸發(fā)的方法
*/
fun setOnclickNoRepeat(vararg views: View?, interval: Long = 300, onClick: (View) -> Unit) {
views.forEach {
it?.clickNoRepeat(interval = interval) { view ->
onClick.invoke(view)
}
}
}
/**
* 防止重復(fù)點(diǎn)擊事件 默認(rèn)0.3秒內(nèi)不可重復(fù)點(diǎn)擊
* @param interval 時(shí)間間隔 默認(rèn)0.3秒
* @param action 執(zhí)行方法
*/
var lastClickTime = 0L
fun View.clickNoRepeat(interval: Long = 300, action: (view: View) -> Unit) {
setOnClickListener {
val currentTime = System.currentTimeMillis()
if (lastClickTime != 0L && (currentTime - lastClickTime < interval)) {
return@setOnClickListener
}
lastClickTime = currentTime
action.invoke(it)
}
}
在Activity/Fragment中使用時(shí):
override fun onViewClicked() {
setOnclickNoRepeat(xxxx1,xxxx2,xxxx3){
when(it.id){
R.id.xxxx1 ->{
...
}
R.id.xxxx2 ->{
...
}
R.id.xxxx3 ->{
...
}
}
}
}