android-layout - 開発 - kotlin 初心者




Kotlin Androidが新しいアクティビティを開始 (9)

詳細

  • Android Studio 3.1.4
  • Kotlinバージョン:1.2.60

ステップ1. Application()

アプリケーションのコンテキストへのリンクを取得します

class MY_APPLICATION_NAME: Application() {

    companion object {
        private lateinit var instance: MY_APPLICATION_NAME
        fun getAppContext(): Context = instance.applicationContext
    }

    override fun onCreate() {
        instance = this
        super.onCreate()
    }

}

ステップ2.ルーターオブジェクトを追加する

object Router {
    inline fun <reified T: Activity> start() {
         val context =  MY_APPLICATION_NAME.getAppContext()
         val intent = Intent(context, T::class.java)
         context.startActivity(intent)
    }
}

使用法

// You can start activity from any class: form Application, from any activity, from any fragment and other  
Router.start<ANY_ACTIVITY_CLASS>()

Androidで別のアクティビティを開始したいのですが、次のエラーが表示されます。

コンストラクターの呼び出しを指定してください。 分類子「Page2」にはコンパニオンオブジェクトがありません

Intent クラスをインスタンス化した後。 エラーを修正するにはどうすればよいですか? 私のコード:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun buTestUpdateText2 (view: View) {
        val changePage = Intent(this, Page2) 
        // Error: "Please specify constructor invocation; 
        // classifier 'Page2' does not have a companion object"

        startActivity(changePage)
    }

}

Javaで Activity を開始するには、 Intent(this, Page2.class) 。基本的に、最初のパラメーターで Context を定義し、2番目のパラメーターで宛先クラスを定義する必要があります。 ソースコードの Intent メソッドによると-

 public Intent(Context packageContext, Class<?> cls)

ご覧のとおり、2番目のパラメーターに Class<?> 型を渡す必要があります。

Intent(this, Page2) を記述することにより Intent(this, Page2) クラスを渡すことを決して指定せず、受け入れられない class タイプを渡そうとします。

::class.java.class 代替である ::class.java を使用します。 以下のコードを使用して Activity を開始してください

Intent(this, Page2::class.java)

例-

val intent = Intent(this, NextActivity::class.java)
// To pass any data to next activity
intent.putExtra("keyIdentifier", value)
// start your next activity
startActivity(intent)

この簡単な方法を使用して、 KOTLIN Activity を開始できます。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun buTestUpdateText2 (view: View) {
        startActivity(Intent(this@MainActivity,ClassName::class.java))

        // Also like this 

        val intent = Intent(this@MainActivity,ClassName::class.java)
        startActivity(intent)
    }

これは、 Page2 クラスに、クラスを使用するためのJavaの static に似たコンパニオンオブジェクトがないためです。 Intent に引数としてクラスを渡すには、次のようなことをする必要があります

val changePage = Intent(this, Page2::class.java)

これを試して

val intent = Intent(this, Page2::class.java)
startActivity(intent)

クラスタイプの2番目の引数を指定する必要があります。 また、以下のようにもう少し整頓することもできます。

startActivity(Intent(this, Page2::class.java).apply {
    putExtra("extra_1", value1)
    putExtra("extra_2", value2)
    putExtra("extra_3", value3)
})

私は同様の問題があり、Kotlinでアプリケーションを書き始めました。問題があるかどうかを確認したいアクティビティの1つを書き直した後、問題はJavaファイルからkotlinにインテントを送信する方法がわからなかったことでしたファイル。

この場合、私はkotlin(コンパニオンオブジェクト)で静的関数を作成しました。この関数は(現在のアクティビティから)コンテキストを取得し、kotlinクラス( " :: class.java ")。

ここに私のコードがあります:

 //this code will be in the kotlin activity - SearchActivity
 companion object {

    fun newIntent(context: Context): Intent {
        return Intent(context, SearchActivity::class.java)
    }
}

    //this is how you call SearchActivity from MainActivity.java
Intent searchIntent = SearchActivity.Companion.newIntent(this);
startActivity(searchIntent);

通常、インライン具体化汎用関数を定義することにより、パラメーター BlahActivity::class.java 指定を単純化できます。

inline fun <reified T: Activity> Context.createIntent() =
    Intent(this, T::class.java)

それができるから

startActivity(createIntent<Page2>()) 

またはさらにシンプル

inline fun <reified T: Activity> Activity.startActivity() {
    startActivity(createIntent<T>()) 
} 

だから今だ

startActivity<Page2>() 

val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.java)
startActivity(intentAct)




kotlin