Kotlin Android начинает новую деятельность

Я хочу начать еще одно действие на Android, но я получаю эту ошибку:

Пожалуйста, укажите вызов конструктора; У классификатора 'Страница2' нет сопутствующего объекта

после создания экземпляра класса 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)
    }

}

Ответ 1

Чтобы запустить Activity в java, мы написали Intent(this, Page2.class), в основном вам нужно определить Context в первом параметре и целевом классе во втором параметре. Согласно методу Intent в исходном коде -

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

Как вы можете видеть, мы должны передать Class<?> Type во втором параметре.

Написав Intent(this, Page2) мы никогда не укажем, что мы собираемся передать класс, мы пытаемся передать тип class который неприемлем.

Используйте ::class.java который является альтернативой .class в kotlin. Используйте приведенный ниже код, чтобы начать свою 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)

Ответ 2

Вы можете попробовать это,

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

Ответ 3

Чтобы начать новую активность,

startActivity(Intent([email protected],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([email protected],ClassName::class.java))

        // Also like this 

        val intent = Intent([email protected],ClassName::class.java)
        startActivity(intent)
    }

Ответ 4

Попробуй это

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

Ответ 5

Вы должны указать второй аргумент типа класса. Вы также можете сделать его немного более аккуратным, как показано ниже.

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

Ответ 6

Это связано с тем, что ваш класс Page2 не имеет объекта-компаньона, который аналогичен static в Java, поэтому для использования вашего класса. Чтобы передать свой класс в качестве аргумента в Intent, вам нужно будет сделать что-то вроде этого

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

Ответ 7

Обычно вы можете упростить спецификацию параметра 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>() 

Ответ 8

Это моя основная деятельность, когда я беру имя пользователя и пароль из текста редактирования и установки на намерение

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([email protected],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")
}

Ответ 9

От деятельности к деятельности

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

От фрагмента до активности

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

Ответ 10

подробности

  • 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. Добавьте объект Router

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