2017-06-28 39 views
2

javaでは、アクティビティのスターター静的メソッドを定義できます。 Androidのメーカーでは、「スターター」テンプレートはそれのためにもあります:私は(Androidのメーカー3.0 Canary4上)Kotlinでこの同じ概念のまわりで私の頭をラップしてるandroidアクティビティKotlinの静的スターターメソッド

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

:それはこのようになります私が思いついたもっとも近いものは、次のようなものです:

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

いくつかの方法があります。私は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への拡張を作成します。サムのアプローチに追加するには

private val EXTRA_FOO = "foo" 

fun Context.startMyActivity(bar : String) { 
    val intent = Intent(this, MyActivity::class.java) 
    intent.putExtra(EXTRA_FOO, bar) 
    startActivity(intent) 
} 
+0

ありがとう、私はこのソリューションが好きです。他のアプローチも提案しますか? – lelloman

+0

しかし、このメソッドを呼び出し元のアクティビティから呼び出すにはどうすればよいですか?私はあなたの第二の選択肢を試みました。 –

+0

@Samコンパニオンオブジェクトを避けるためにフラグメントを作成する提案がありますか? – mac229

0

、私は一般的に拡張機能を使用:


ここで、同じ拡張機能は、あなたがすでに持っているものに、より簡単に比較できるように、より多くのJavaのようなスタイルであります活動のために、しかし、あなたは新しいインスタンスを作成して、引数を渡す必要がある断片のようなケースでは、私は次のことを検討してください。

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

オペレータ機能を使用すると、目を使用することができます表記法のようなコンストラクタ。

関連する問題