2016-09-14 5 views
3

У меня есть Util класса Котлин, где я установил название на панели инструментов, скрыть или показать панель инструментов зависит от фрагмента:метод вызова из Котлин класса

class MyToolbarUtils() { 

    fun hideToolbar(activity: Activity) { 
     (activity as MainActivity).supportActionBar!!.hide() 
    } 

    fun showToolbar(activity: Activity, tag: String) { 
     setToolbarTitle(tag, activity) 
     (activity as MainActivity).supportActionBar!!.show() 
    } 

    fun setToolbarTitle(tag: String, activity: Activity) { 
     var title = "" 
     when (tag) { 
      "Main_fragment" -> title = activity.resources.getString(R.string.Main_screen) 
      "Add_note" -> title = activity.resources.getString(R.string.Add_note) 
     } 
     activity.title = title 
    } 
} 

как позвонить showToolbar (...) из фрагмента? Я просто попытался MyToolbarUtils.showToolbar(..), но это не может быть возможно

только один способ я обнаружил это:

val setToolbarTitle = MyToolbarUtils() 
setToolbarTitle.showToolbar(activity, tag) 

но должен быть лучший способ сделать это ..

+0

Имеет ли Kotlin статические методы? Если нет, то, что вы показали, имеет смысл. –

+0

Если все они работают только с одним классом, «MainActivity», почему они просто не методы в этом классе? –

+0

Вы задали [xy question] (http://xyproblem.info/) ... вы решили ответить на проблему программирования, а затем попросили о помощи, используя этот заранее определенный ответ. Но в этом случае ваш ответ не совсем правильный. Idiomatic Kotlin не использовал бы объявления о статике или объекте в таком случае, но вместо этого использовал http://stackoverflow.com/a/39499145/3679676 –

ответ

3

Преобразование класс в объект который должен так же работать на ява статические методы.

Вы можете получить более подробную информацию здесь: https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations

+0

Я не знал этого, очень много! – Stepan

+0

, тогда как вызвать эту функцию из фрагмента и адаптера? –

3

MyToolbarUtils Похоже, должен быть object declaration вместо класса.

Другим способом было бы объявить функции внутри этого класса на верхнем уровне в файле (не внутри какого-либо класса) и просто ссылаться на них по их простому имени.

+0

, это помогло, спасибо – Stepan

-1
// Kotlin 

@file:JvmName("DemoUtils") 
package demo 

class ClassInKotlin 

fun methodInKotlin() { 
} 

// Java 
new demo.ClassInKotlin(); 
demo.DemoUtils.methodInKotlin(); 

Попробуйте это. Это должно сработать.

+0

Это не имеет смысла. Он не пытается вызывать код с Java, и вам не нужно иметь '@ JvmName', а не' ClassInKotlin' и вызовы с Java. –

2

Другие ответили, как заставить ваши функции чувствовать себя статическими методами, но для этого варианта использования у вас есть более идиоматический вариант.

функции расширения в Котлин заменить статические служебные классы в 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.

Смежные вопросы