Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将扩展函数包装到另一个_Android_Lambda_Kotlin - Fatal编程技术网

Android 将扩展函数包装到另一个

Android 将扩展函数包装到另一个,android,lambda,kotlin,Android,Lambda,Kotlin,我想简化我的代码 我已经实现了一种在使用SearchView触摸屏幕时隐藏软键盘的方法 我给你看代码 调用(在活动中,sv是SearchView的实例) 趣味扩展 fun Activity.hideKeyboard(context: Context, sv: SearchView) { hideKeyboard(HideKeyboardWithSearchView(context, sv)) } fun Activity.hideKeyboard(hideKeyboard: HideK

我想简化我的代码

我已经实现了一种在使用SearchView触摸屏幕时隐藏软键盘的方法

我给你看代码

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

趣味扩展

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或类似的语言应该很容易,但我不能很好地控制语言的这一部分…:-(

有什么想法吗?:-)


解决方案

由和解决


首先,您不需要将
上下文
传递到
活动
的扩展中(除了少数特殊情况)

第二,我真的不明白你想怎么把它们合并成一个?除非您的意思是同时删除第二个扩展,否则在这种情况下,您的第一个方法应该只包含第二个扩展的主体:

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

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

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

非常感谢你!非常感谢你。我完全同意你关于不要通过上下文的建议。我不知道我在想什么…:-D
fun Activity.hideKeyboard(sv: SearchView) {
    val hideKeyboardSV = HideKeyboardWithSearchView(this, sv)
    window.decorView.rootView.setOnTouchListener { _, _ ->
        hideKeyboard.start()
        return@setOnTouchListener false
    }
}
fun Activity.hideKeyboard(sv: View) {
    window.decorView.rootView.setOnTouchListener { _, _ ->
        HideKeyboardWithSearchView(this, sv).start()
        return@setOnTouchListener false
    }
}