在java中,可以为Activity定义一个启动静态方法。在Android Studio中,甚至还有一个“启动”模板:它看起来像这样:
public class MyActivity extends AppCompatActivity {
private static final String EXTRA_FOO = "foo";
public static void start(Context caller, String bar){
Intent intent = new Intent(caller, MyActivity.class);
intent.putExtra(EXTRA_FOO, bar);
caller.startActivity(intent);
}
}
我在Kotlin围绕着这个相同的概念,我想出的最接近的东西是这样的:
class MyActivity : AppCompatActivity() {
companion object {
private val EXTRA_FOO = "foo"
fun start(caller: Context, bar: String){
val intent = Intent(caller, MyActivity::class.java)
intent.putExtra(EXTRA_FOO, bar)
caller.startActivity(intent)
}
}
}
有更简洁优雅的方法吗?我不敢相信这是要走的路,它看起来比Java更丑。此外,Kotlin没有“首发”模板。
答案 0 :(得分:3)
您可以采取一些方法。我是extension functions的粉丝:
class MyActivity : AppCompatActivity()
private fun Intent.extraFoo(bar : String) = putExtra("foo", bar)
fun Context.startMyActivity(bar : String) =
Intent(this, MyActivity::class.java).apply { extraFoo(bar) }.let(this::startActivity)
这会为Context
创建一个扩展程序,以便您可以在任何startMyActivity
对象上调用Context
。
这是类似Java风格的相同扩展功能,因此您可以更轻松地将其与您已有的功能进行比较:
private val EXTRA_FOO = "foo"
fun Context.startMyActivity(bar : String) {
val intent = Intent(this, MyActivity::class.java)
intent.putExtra(EXTRA_FOO, bar)
startActivity(intent)
}
答案 1 :(得分:0)
为了添加Sam的方法,我通常使用扩展来进行活动,但是在需要创建新实例和传递参数的片段之类的情况下,我可以考虑以下内容:
class F : Fragment() {
companion object {
operator fun invoke(text: String): F {
val f = F()
val bundle = Bundle()
bundle.putString("key", text)
f.arguments = bundle
return f
}
fun test() {
//you can now initialize a fragment and put text in its bundle like so
val f = F("hi")
}
}
}
运算符函数允许您使用构造函数,如符号。