来自Kotlin类的调用方法

时间:2016-09-14 11:57:53

标签: android fragment toolbar kotlin

我有一个util Kotlin类,我在其中设置工具栏标题,隐藏或显示工具栏取决于片段:

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
    }
}

如何从Fragment调用showToolbar(...)? 我刚试过MyToolbarUtils.showToolbar(..),但这是不可能的

我发现的唯一方法是:

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

但必须有更好的方法来做到这一点..

6 个答案:

答案 0 :(得分:10)

转换为对象,它应该与java静态方法类似。

您可以在此处获取更多信息:https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations

答案 1 :(得分:4)

MyToolbarUtils之类的声音应该是object declaration而不是类。

另一种方法是在文件的顶层(不在任何类中)中声明此类中的函数,并通过它们的简单名称引用它们。

答案 2 :(得分:2)

其他人回答了如何使你的函数感觉像静态方法,但对于这个用例,你有一个更惯用的选项。

Kotlin中的扩展函数替换Java中的静态实用程序类:

由于所有您的函数都使用Activity作为参数,为什么不使用extension functions并使它们扩展ActivityMainActivity而不是?

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?
    }
}

现在它们都在您的MainActivityActivity类的背景下(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代替。

答案 3 :(得分:0)

使用object关键字在Kotlin中创建一个单例类,然后像下面这样在Java中调用Kotlin单例类:

object SampleSingleton {
   fun someMethod() { 
     println("I love coding")
   }
}

如果来自Java,则如下所示

public static void main(String args[]) {
   SampleSingleton.INSTANCE.someMethod();
}

或来自Kotlin类的

SampleSingleton.someMethod()

答案 4 :(得分:0)

我不确定这是否符合您对更好方法的定义,但更简单的方法是替换您的两行代码:

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

仅此一行;

MyToolbarUtils().showToolbar(activity, tag)

快乐编码!

答案 5 :(得分:-2)

// Kotlin

@file:JvmName("DemoUtils")
package demo

class ClassInKotlin

fun methodInKotlin() {
}

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

试试这个。这应该有用。