Функция расширения Kotlin начинает работу с дополнениями Intent - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь написать функцию расширения kotlin для Context, которая начнет новое действие в Android с заданным именем класса и списком дополнительных функций.Я могу успешно начать деятельность без каких-либо дополнительных действий, но у меня возникла проблема с ними.

fun <T> Context.openActivity(it: Class<T>, pairs: List<Pair<String, Any>>) {
  var intent = Intent()
  pairs.forEach {
     intent.putExtra(it.first, it.second)
  }
  startActivity(intent)
}

Основная проблема здесь -> intent.putExtra () не исключает второй параметр как Any

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Вместо использования списка пар, рассмотрите возможность использования Bundle.Затем вы можете добавить его с помощью putExtras(Bundle).

Если вы хотите пойти на шаг впереди, вы можете добавить лямбда-расширение для настройки дополнительных параметров:

fun <T> Context.openActivity(it: Class<T>, extras: Bundle.() -> Unit = {}) {
  var intent = Intent(this, it)
  intent.putExtras(Bundle().apply(extras))
  startActivity(intent)
}

Тогда вы можете назвать это как:

openActivity(MyActivity::class.java) {
  putString("string.key", "string.value")
  putInt("string.key", 43)
  ...
}
0 голосов
/ 16 декабря 2018

В объекте Intent нет метода putExtra(String, Any).Вы можете использовать Bundle объект для сохранения ваших данных:

fun <T> Context.openActivity(it: Class<T>, bundleKey: String, bundle: Bundle) {
    var intent = Intent(this, it)
    intent.putExtra(bundleKey, bundle)
    startActivity(intent)
}

Чтобы вызвать его внутри Context объекта:

val bundle = Bundle()
bundle.putString("Key", "Value") // you can put another object here
openActivity(SomeActivity::class.java, "Bundle Key", bundle)
...