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


102

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

}

@BakaWaiiそのページはもう存在しません。
2018

回答:


177

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

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

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

記述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)

4
彼らがなぜそれをの::class.java代わりに変更したの.classか?Kotlinのアプローチは、Javaに比べて非常に複雑です。
Mr-IDE、

2
@ Mr-IDE classはKotlinを返しますKClassが、AndroidはJavaを想定しているClass<...>ため、この.javaプロパティを想定しています。
kirbyfan64sos

34

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

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

1
新しいアクティビティを開始するためにputExtraメソッドを使用する必要はありません。
ShadeToD

@ShadeToDうん!putExtraメソッドを使用する必要はありません。新しいものを開始するときに値を渡すために追加しましたActivity
Gowtham Subramaniam '10 / 06/04

31

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

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

2
this @ ActivityはJavaのActivity.thisと同じです:)
leoelstin

12

一般に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>() 

kotlinの初心者として、どのようにしてputExtra()の可変数(またはなし)を植えますか?
2018

1
inline fun <reified T: Activity> Context.createIntent(vararg extras: Pair<String, Any?>) = Intent(this, T::class.java).apply { putExtras(bundleOf(*extras)) }私が言ったことの代わりに設定することができ、それは機能します(bundleOfandroid-ktxまたはankoから持っていると仮定)
EpicPandaForce

10

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

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

7

これを試して

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

6

これは、編集テキストと設定からユーザー名とパスワードを取得する私の主なアクティビティです

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

4

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

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

4

活動から活動へ

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

断片から活動へ

val intent = Intent(activity, YourActivity::class.java)
startActivity(intent)

4

さて、私はこれらの2つの方法がすべての結果の中で最も単純であることがわかりました。

方法#1:

accoun_btn.setOnClickListener {
            startActivity(Intent(this@MainActivity, SecondActivity::class.java))
        }

方法2:(一般的な方法で)

    accoun_btn.setOnClickListener {
        startActivity<SecondActivity>(this)
    }

    private inline fun <reified T> startActivity(context: Context) {
            startActivity(Intent(context, T::class.java))
        }

サンプル



1

同様の問題があり、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);

あなた@JvmStaticがあなたのnewIntentメソッドに追加するならば、あなたはCompanion部分なしでそれをJavaから呼び出すことができます。
19

0

細部

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

0

あなたにAndroidManifest.xmlも提示したい活動をあなたにも追加することを忘れないでください:-)それは私にとって問題でした。


0

これはカプセル化を考慮するためにどうですか?

例えば:


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

        val title = intent.getStringExtra(EXTRA_TITLE) ?: EXTRA_TITLE_DEFAULT

        supportFragmentManager.beginTransaction()
            .add(R.id.frame_layout_fragment, ContentsFragment.newInstance())
            .commit()
    }

    // Omit...

    companion object {

        private const val EXTRA_TITLE = "extra_title"
        private const val EXTRA_TITLE_DEFAULT = "No title"

        fun newIntent(context: Context, title: String): Intent {
            val intent = Intent(context, ContentsActivity::class.java)
            intent.putExtra(EXTRA_TITLE, title)
            return intent
        }
    }

0

アプリケーションでは、KotlinファイルとJavaファイルの両方を使用できます。

2つのファイルを切り替えるには、次のように、AndroidManifest.xmlで一意の<action android:name = ""を指定してください。

            <activity android:name=".MainActivityKotlin">
                <intent-filter>
                    <action android:name="com.genechuang.basicfirebaseproject.KotlinActivity"/>
                    <category android:name="android.intent.category.DEFAULT" />
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.genechuang.basicfirebaseproject.MainActivityJava"
                android:label="MainActivityJava" >
                <intent-filter>
                    <action android:name="com.genechuang.basicfirebaseproject.JavaActivity" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>

次に、MainActivity.kt(Kotlinファイル)で、Javaで記述されたアクティビティを開始するには、次のようにします。

       val intent = Intent("com.genechuang.basicfirebaseproject.JavaActivity")
        startActivity(intent)

MainActivityJava.java(Javaファイル)で、Kotlinで記述されたアクティビティを開始するには、次のようにします。

       Intent mIntent = new Intent("com.genechuang.basicfirebaseproject.KotlinActivity");
        startActivity(mIntent);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.