Kotlin中的Activity Activity静态启动器方法

在java中,可以为Activity定义一个starter静态方法。 在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(Android Studio 3.0 Canary4)中围绕着这个相同的概念,最近的事情是这样的:

 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没有“starter”模板。

有几种方法可以采取。 我是扩展功能的粉丝:

 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的扩展,以便您可以在任何Context对象上调用startMyActivity


下面是一个更类似于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) } 

为了添加到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") } } } 

运算符函数允许您使用符号的构造函数。