android-layout - uma - service android




Kotlin Android iniciar uma nova actividade (9)

Quero começar outra atividade no Android, mas recebo este erro:

Por favor, especifique a invocação do construtor; classificador 'Page2' não possui um objeto complementar

depois de instanciar a classe Intent . O que devo fazer para corrigir o erro? Meu código:

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

}

Detalhes

  • Android Studio 3.1.4
  • Versão Kotlin: 1.2.60

Etapa 1. Aplicativo ()

Obter link para o contexto de sua aplicação

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

}

Etapa 2. Adicionar o objeto 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)
    }
}

Uso

// You can start activity from any class: form Application, from any activity, from any fragment and other  
Router.start<ANY_ACTIVITY_CLASS>()

Esta é a minha atividade principal, onde eu pego o nome de usuário e senha do texto de edição e configuração para a intenção

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

Esta é a minha segunda atividade onde eu tenho que receber valores da atividade principal

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

Isso ocorre porque sua classe Page2 não tem um objeto complementar que seja semelhante a static em Java, portanto, use sua classe. Para passar sua classe como um argumento para Intent , você terá que fazer algo assim

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

Lembre-se de adicionar a atividade que você deseja apresentar, ao seu AndroidManifest.xml também :-) Esse foi o problema para mim.


Para iniciar uma nova atividade,

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

Então mude seu código para:

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

Simplesmente você pode iniciar uma Activity no KOTLIN usando este método simples,

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

Você pode geralmente simplificar a especificação do parâmetro BlahActivity::class.java definindo uma função genérica reificada inline.

inline fun <reified T: Activity> Context.createIntent() =
    Intent(this, T::class.java)

Porque isso permite que você faça

startActivity(createIntent<Page2>()) 

Ou ainda mais simples

inline fun <reified T: Activity> Activity.startActivity() {
    startActivity(createIntent<T>()) 
} 

Então é agora

startActivity<Page2>() 

Você tem que dar o segundo argumento do tipo de classe. Você também pode tê-lo um pouco mais arrumado como abaixo.

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

val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.java)
startActivity(intentAct)




kotlin