Kotlin中的android Activity静态启动方法

时间:2017-06-28 18:42:50

标签: android kotlin

在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没有“首发”模板。

2 个答案:

答案 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")
        }
    }
}

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