Kotlin Android에서 새 활동 시작


104

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 그 페이지가 더 이상 존재하지 않습니다.
Scre

답변:


179

Activity우리가 작성한 자바에서 를 시작하려면 Intent(this, Page2.class)기본적으로 Context첫 번째 매개 변수와 두 번째 매개 변수의 대상 클래스 를 정의해야합니다 . 에 따라 Intent소스 코드의 방법 -

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

보시다시피 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)

4
::class.java대신 왜 변경했는지 .class아십니까? Kotlin 접근 방식은 Java에 비해 비정상적으로 복잡합니다.
Mr-IDE

3
@ 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 19

@ShadeToD 그래! putExtra방법 을 사용할 필요가 없습니다 . 새 시작할 때 난 그냥 값을 전달을 위해 추가Activity
Gowtham Subramaniam

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
이 @ 활동이 : 자바의 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 ()의 변수 번호를 심을 수 있습니까?
Scre

1
당신은 설정할 수 있습니다 inline fun <reified T: Activity> Context.createIntent(vararg extras: Pair<String, Any?>) = Intent(this, T::class.java).apply { putExtras(bundleOf(*extras)) }내가 말한 대신 그것은 (당신이 가정 일 것입니다 bundleOf안드로이드 - KTX 또는 ANKO에서)
EpicPandaForce

10

클래스 유형의 두 번째 인수를 제공해야합니다. 아래와 같이 좀 더 깔끔하게 할 수도 있습니다.

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

이것은 주요 활동에서 가치를 받아야하는 두 번째 활동입니다.

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

글쎄, 나는이 두 가지 방법이 모든 결과 중 가장 간단한 것을 발견했습니다.

방법 # 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
val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.java)
startActivity(intentAct)

1

비슷한 문제가 있었고 Kotlin에서 응용 프로그램을 작성하기 시작했습니다. 내 활동 중 하나를 다시 작성한 후 문제가 있는지 확인하고 싶었습니다. 문제는 Java 파일에서 kotlin으로 의도를 보내는 방법을 잘 모르겠다는 것입니다. 파일.

이 경우 kotlin (컴패니언 객체)에서 정적 함수를 만들었습니다.이 함수는 컨텍스트 (현재 활동에서)를 가져오고 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);

당신이 추가하면 @JvmStatic당신에게 newIntent방법 당신은없이 자바에서 호출 할 수있는 Companion부분이다.
Wirling

0

세부

  • 안드로이드 스튜디오 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 및 자바 파일을 모두 사용할 수 있습니다.

두 파일간에 전환하려면 다음과 같이 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);

0

다른 활동으로 이동하는 또 다른 간단한 방법은

Intent(this, CodeActivity::class.java).apply {
                    startActivity(this)
                }

1
Pls는 다른 사람들이 이로부터 혜택을받을 수 있도록 코드를 설명하고 어떻게 도움이 될지 고려합니다.
Amit Verma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.