андроидный статический старт-метод активности в Котлине

В 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 (на 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. Кроме того, для Котлина нет шаблона «стартера».

Есть несколько подходов, которые вы могли бы предпринять. Я поклонник функций расширения :

 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) } 

Чтобы добавить к подходу Сэма, я обычно использую расширения для действий, но в таких случаях, как фрагменты, где вам нужно создать новый экземпляр и передать аргументы, я могу рассмотреть следующее:

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

Функция оператора позволяет использовать конструктор как обозначение.

Intereting Posts