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)
}
}
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)
새 활동을 시작하려면
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)
}
이 간단한 방법을 사용하여 시작하면 Activity됩니다 KOTLIN.
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", value)
startActivity(intent)
일반적으로 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>()
클래스 유형의 두 번째 인수를 제공해야합니다. 아래와 같이 좀 더 깔끔하게 할 수도 있습니다.
startActivity(Intent(this, Page2::class.java).apply {
putExtra("extra_1", value1)
putExtra("extra_2", value2)
putExtra("extra_3", value3)
})
이 시도
val intent = Intent(this, Page2::class.java)
startActivity(intent)
이것은 텍스트 편집 및 의도 설정에서 사용자 이름과 비밀번호를 가져 오는 내 주요 활동입니다.
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")
}
이는 Page2클래스에 클래스 static를 사용하기 위해 Java에서 와 유사한 동반 객체 가 없기 때문 입니다. 클래스를에 인수로 전달하려면 Intent다음과 같이해야합니다.
val changePage = Intent(this, Page2::class.java)
활동에서 활동으로
val intent = Intent(this, YourActivity::class.java)
startActivity(intent)
단편에서 활동으로
val intent = Intent(activity, YourActivity::class.java)
startActivity(intent)
val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.java)
startActivity(intentAct)
세부
- 안드로이드 스튜디오 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>()
당신이 발표하고 싶은 활동을 당신에게도 추가하는 것을 잊지 마십시오. AndroidManifest.xml:-) 그것이 저에게 문제였습니다.
비슷한 문제가 있었고 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);
글쎄, 나는이 두 가지 방법이 모든 결과 중 가장 간단한 것을 발견했습니다.
방법 # 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))
}
참고 URL : https://stackoverflow.com/questions/45518139/kotlin-android-start-new-activity
'Program Club' 카테고리의 다른 글
| VueJS는 조건부로 요소에 대한 속성을 추가합니다. (0) | 2020.10.23 |
|---|---|
| 문자열을 JSON 배열로 변환 (0) | 2020.10.22 |
| colid 6에 대해 bcp 클라이언트로부터 유효하지 않은 열 길이를 받았습니다. (0) | 2020.10.22 |
| 파이썬 변수 선언 (0) | 2020.10.22 |
| Lodash 제목 대소 문자 (모든 단어의 첫 번째 대문자) (0) | 2020.10.22 |
