Обернуть функцию расширения в другую - PullRequest
0 голосов
/ 16 мая 2018

Я хочу упростить мой код.

Я реализовал способ скрытия программной клавиатуры при касании экрана с помощью 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()
    }
}

Я хотел бы объединить два забавных расширения в одно. Я думаю, что это должно быть легко с лямбдой или подобным, но я не очень хорошо контролирую эту часть языка ...: - (

Есть идеи? : -)


РЕШЕНИЕ

Решено Ря и Павел .

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

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

вы можете просто использовать второй как:

fun Activity.hideKeyboard(sv: View) {
    window.decorView.rootView.setOnTouchListener { _, _ ->
        HideKeyboardWithSearchView(this, sv).start()
        return@setOnTouchListener false
    }
}
0 голосов
/ 16 мая 2018

Во-первых, вам не нужно передавать Context в расширение Activity s (кроме нескольких особых случаев).

Во-вторых, я не понимаю, как вы хотите объединить их в один? Если вы не имеете в виду удаление второго расширения все вместе, в этом случае ваш первый метод должен просто содержать тело второго:

fun Activity.hideKeyboard(sv: SearchView) {
    val hideKeyboardSV = HideKeyboardWithSearchView(this, sv)
    window.decorView.rootView.setOnTouchListener { _, _ ->
        hideKeyboard.start()
        return@setOnTouchListener false
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...