web-dev-qa-db-ja.com

Kotlin Androidが新しい活動を始めます

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

}
67
J Adonai Dagdag

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

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

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

Intent(this, Page2)と書くことで、クラスを渡すことを指定しないで、受け入れられないclass型を渡すことを試みています。

Kotlinの::class.Javaの代わりになる.classを使用してください。あなたの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)
119
Rahul

この簡単な方法でActivityKOTLINを始めることができます。

val intent = Intent(this, SecondActivity::class.Java)
intent.putExtra("key", value)
startActivity(intent)
24

新しいアクティビティを開始するには

startActivity(Intent(this@CurrentClassName,RequiredClassName::class.Java)

だからあなたのコードを変更します:

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)
    }
22
flutterfire.dev

これを試して

val intent = Intent(this, Page2::class.Java)
startActivity(intent)
7
Boris

あなたはクラス型の2番目の引数を与えなければなりません。以下のようにもう少しきれいにすることもできます。

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

インライン実体化総称関数を定義することによって、一般的にパラメーター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>() 
7
EpicPandaForce

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

val changePage = Intent(this, Page2::class.Java)
3
Alf Moh

これは私が編集テキストからユーザー名とパスワードを取得し、意図を設定する私の主な活動です。

class MainActivity : AppCompatActivity() {
val userName = null
val password = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
    val intent = Intent(this@MainActivity,SecondActivity::class.Java);
    var userName = username.text.toString()
    var password = password_field.text.toString()
    intent.putExtra("Username", userName)
    intent.putExtra("Password", password)
    startActivity(intent);
 }
}

これは私がメインアクティビティから値を受け取る必要がある私の2番目のアクティビティです。

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
var strUser: String = intent.getStringExtra("Username")
var strPassword: String = intent.getStringExtra("Password")
user_name.setText("Seelan")
passwor_print.setText("Seelan")
}
3
Bharat Vasoya

活動から活動へ

val intent = Intent(this, YourActivity::class.Java)
startActivity(intent)

フラグメントからアクティビティまで

val intent = Intent(activity, YourActivity::class.Java)
startActivity(intent)
2
Masum
val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.Java)
startActivity(intentAct)
1
ashishsonani

あなたが提示したいアクティビティをあなたのAndroidManifest.xmlにも追加するのを忘れないでください:-)それが私にとっての問題でした。

0
Nicolai Harbo

詳細

  • Android Studio 3.1.4
  • コトリン版:1.2.60

ステップ1。アプリケーション()

あなたのアプリケーションのコンテキストへのリンクを取得する

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>()
0

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

この場合、私はkotlin(companionオブジェクト)で静的関数を作成しました。この関数は(現在のアクティビティから)コンテキストを取得し、kotlinクラス( "Java"コンテキスト)を使用しながら新しいインテントを返します。 :: 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);
0
Anton Makov