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

如何从片段调用showToolbar(…)? 我只是尝试MyToolbarUtils.showToolbar(..)但它是不可能的

我发现的唯一方法是:

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

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

将你的转换成一个类似于java静态方法的对象。

你可以在这里获得更多信息: https : //kotlinlang.org/docs/reference/object-declarations.html#object-declarations

听起来像MyToolbarUtils应该是一个对象声明,而不是一个类。

另一种方法是在一个文件的顶层(不在任何类中)声明这个类内的函数,只是用它们的简单名称来引用它们。

其他人回答如何让你的function感觉像静态方法,但对于这种用例,你有一个更习惯的选择。

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

由于所有的函数都将Activity作为参数,为什么不使用扩展函数并使其扩展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? } } 

现在他们都是在你的MainActivity或者Activity类的上下文中(现在它们是其中一个的实例),你不必在其他一些不相关的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") 

另外请注意,我清理了一些代码,并用作expression式来设置标题,同时还删除了var (当您需要var时很少见,所以请始终考虑如何使用val )。 而作为一个expression式的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 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? } } } 

但是我认为这是扩展另一个类的function的最差和最不科学的方式。 类似SomethingUtils的静态类的对象意味着你可能应该写扩展函数 。

 // Kotlin @file:JvmName("DemoUtils") package demo class ClassInKotlin fun methodInKotlin() { } // Java new demo.ClassInKotlin(); demo.DemoUtils.methodInKotlin(); 

尝试这个。 这应该工作。