Другие ответили, как заставить ваши функции чувствовать себя статическими методами, но для этого варианта использования у вас есть более идиоматический вариант.
функции расширения в Котлин заменить статические служебные классы в Java:
С все ваших функций принимают Activity
в качестве параметра, то почему бы не использовать extension functions и сделать их расширить класс Activity
или MainActivity
вместо?
fun MainActivity.hideToolbar() {
supportActionBar!!.hide()
}
fun MainActivity.showToolbar(tag: String) {
setToolbarTitle(tag)
supportActionBar!!.show()
}
fun Activity.setToolbarTitle(tag: String) {
title = when (tag) {
"Main_fragment" -> title = resources.getString(R.string.Main_screen)
"Add_note" -> title = resources.getString(R.string.Add_note)
else -> "" // or did you mean this to be an exception?
}
}
Сейчас все они находятся в контексте ваших MainActivity
или Activity
классов (this
теперь является экземпляром одного из них), вы не должны идти охотиться на них в какой-то другой, не связанной ActivityUtils
класса , Всякий раз, когда вы находитесь внутри класса активности вы можете просто:
showToolbar("Main_fragment")
или откуда-то еще, где у вас есть ссылка на деятельность:
// you have a reference of MainActivity type
myMainActivity.showToolbar("Main_fragment")
// you have a reference you can cast to MainActivity type
(someActivity as MainActivity).showToolbar("Main_fragment")
// this function works with any Activity
someActivity.setToolbarTitle("Add_note")
Также обратите внимание, что я очистил код немного и используется when
as an expression, чтобы установить заголовок, а также удаление var
(это редко, когда вам нужен var
, поэтому всегда думайте о том, как работать с val
). И в качестве выражения when
понадобится предложение else
, поэтому я сделал это так же, как и по умолчанию ""
пустая строка.
Альтернатива, как методы класса:
Поскольку все 3 метода все требуют экземпляра MainActivity
(на основании их литьем), почему бы не просто поставить их в MainActivity
в качестве функции члена.
class MainActivity ... {
...
fun hideToolbar() {
supportActionBar!!.hide()
}
fun showToolbar(tag: String) {
setToolbarTitle(tag)
supportActionBar!!.show()
}
fun setToolbarTitle(tag: String) {
title = when (tag) {
"Main_fragment" -> title = resources.getString(R.string.Main_screen)
"Add_note" -> title = resources.getString(R.string.Add_note)
else -> "" // or did you mean this to be an exception?
}
}
}
И назовите их с любой ссылки на MainActivity
.
Альтернатива в декларации объекта:
Наконец, как предложено другими и для полноты картины, здесь они находятся в полезности класса действует аналогично для статики, но вместо этого метода на одноточечного object declaration:
object MyToolbarUtils() {
fun hideToolbar(activity: MainActivity) {
activity.supportActionBar!!.hide()
}
fun showToolbar(activity: MainActivity, tag: String) {
setToolbarTitle(activity, tag)
activity.supportActionBar!!.show()
}
fun setToolbarTitle(activity: Activity, tag: String) {
activity.title = when (tag) {
"Main_fragment" -> title = resources.getString(R.string.Main_screen)
"Add_note" -> title = resources.getString(R.string.Add_note)
else -> "" // or did you mean this to be an exception?
}
}
}
Но я думаю, что это самый худший и наименее похожий на Kotlin способ расширить функциональность другого класса. Классы/объекты, такие как SomethingUtils
, полные статики, означает, что вы, вероятно, должны писать extension functions.
Имеет ли Kotlin статические методы? Если нет, то, что вы показали, имеет смысл. –
Если все они работают только с одним классом, «MainActivity», почему они просто не методы в этом классе? –
Вы задали [xy question] (http://xyproblem.info/) ... вы решили ответить на проблему программирования, а затем попросили о помощи, используя этот заранее определенный ответ. Но в этом случае ваш ответ не совсем правильный. Idiomatic Kotlin не использовал бы объявления о статике или объекте в таком случае, но вместо этого использовал http://stackoverflow.com/a/39499145/3679676 –