我有一个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)
但必须有更好的方法来做到这一点..
答案 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并使它们扩展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代替。
答案 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();
试试这个。这应该有用。