从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
作为参数,为什么不使用扩展函数并使其扩展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
类的上下文中(现在它们是其中一个的实例),你不必在其他一些不相关的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();
尝试这个。 这应该工作。