Android 将扩展函数包装到另一个
我想简化我的代码 我已经实现了一种在使用SearchView触摸屏幕时隐藏软键盘的方法 我给你看代码 调用(在活动中,sv是SearchView的实例) 趣味扩展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
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
}
}