将扩展功能包装到另一个中

时间:2018-05-16 10:25:23

标签: android lambda kotlin

我想简化我的代码。

当我使用SearchView触摸屏幕时,我实现了隐藏软键盘的方法。

我告诉你代码......

调用(在sv是SearchView实例的活动中)

hideKeyboard(this, sv)

有趣的扩展程序

fun Activity.hideKeyboard(context: Context, sv: SearchView) {
    hideKeyboard(HideKeyboardWithSearchView(context, sv))
}

fun Activity.hideKeyboard(hideKeyboard: HideKeyboardWithSearchView) {
    window.decorView.rootView.setOnTouchListener { _, _ ->
        hideKeyboard.start()
        return@setOnTouchListener false
    }
}

执行操作的课程

import android.content.Context
import android.support.v7.widget.SearchView
import android.view.inputmethod.InputMethodManager

class HideKeyboardWithSearchView(private val context: Context, private val sv: SearchView) {

    fun start() {
        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(sv.windowToken, 0)
        sv.clearFocus()
    }
}

我想将两个有趣的扩展合并为一个。我认为这应该很容易用lambda或类似的,但我不能很好地控制这部分语言......: - (

有什么想法吗? : - )

ryaPawel解决。

fun Activity.hideKeyboard(sv: SearchView) {
    window.decorView.rootView.setOnTouchListener { _, _ ->
        HideKeyboardWithSearchView(this, sv).start()
        return@setOnTouchListener false
    }
}

2 个答案:

答案 0 :(得分:2)

首先,您不需要将Context传递到Activity分机(除少数特殊情况外)。

其次,我真的不明白你想把它们合并成一个吗?除非你的意思是同时删除第二个扩展,否则你的第一个方法应该只包含第二个扩展的主体:

fun Activity.hideKeyboard(sv: SearchView) {
    val hideKeyboardSV = HideKeyboardWithSearchView(this, sv)
    window.decorView.rootView.setOnTouchListener { _, _ ->
        hideKeyboard.start()
        return@setOnTouchListener false
    }
}

答案 1 :(得分:2)

你可以像这样使用第二个:

fun Activity.hideKeyboard(sv: View) {
    window.decorView.rootView.setOnTouchListener { _, _ ->
        HideKeyboardWithSearchView(this, sv).start()
        return@setOnTouchListener false
    }
}