tutorial studio plugin extensions android-layout android-studio android-activity kotlin

android layout - studio - Kotlin Android inicia nueva actividad



kotlin tutorial (13)

Detalles

  • Android Studio 3.1.4
  • Versión de Kotlin: 1.2.60

Paso 1. Aplicación ()

Obtenga un enlace al contexto de su solicitud

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

Paso 2. Agregar objeto enrutador

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

Quiero comenzar otra actividad en Android, pero aparece este error:

Por favor, especifique la invocación del constructor; clasificador ''Página2'' no tiene un objeto complementario

después de instanciar la clase Intent . ¿Qué debo hacer para corregir el error? Mi 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) } }


En general, puede simplificar la especificación del parámetro BlahActivity::class.java definiendo una función genérica reificada en línea.

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

Porque eso te permite hacer

startActivity(createIntent<Page2>())

O incluso más simple

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

Entonces es ahora

startActivity<Page2>()


Esta es mi actividad principal donde tomo el nombre de usuario y la contraseña de la edición de texto y la configuración a la intención

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 es mi segunda actividad donde tengo que recibir valores de la actividad 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") }


Esto se debe a que su clase Page2 no tiene un objeto complementario que sea similar a la static en Java, por lo que debe usar su clase. Para pasar su clase como argumento a Intent , tendrá que hacer algo como esto

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


Para comenzar una Activity en Java, escribimos Intent(this, Page2.class) , básicamente debes definir el Context en el primer parámetro y la clase de destino en el segundo parámetro. Según el método de Intent en el código fuente:

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

Como puede ver, tenemos que pasar la Class<?> En el segundo parámetro.

Al escribir Intent(this, Page2) nunca especificamos que vamos a pasar la clase, estamos tratando de pasar el tipo de class que no es aceptable.

Use ::class.java que es una alternativa de .class en kotlin. Use el siguiente código para comenzar su Activity

Intent(this, Page2::class.java)

Ejemplo

val intent = Intent(this, NextActivity::class.java) // To pass any data to next activity intent.putExtra("keyIdentifier", value) // start your next activity startActivity(intent)


Para comenzar una nueva actividad,

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

Entonces cambie su código a:

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


Prueba esto

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


Recuerde agregar la actividad que desea presentar, a su AndroidManifest.xml también :-) Ese fue el problema para mí.


Simplemente puede iniciar una Activity en KOTLIN utilizando este método simple,

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


Tienes que dar el segundo argumento de tipo de clase. También puede tenerlo un poco más ordenado como a continuación.

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


Tuve un problema similar, comencé a escribir mi solicitud en Kotlin, después de reescribir una de mis actividades, quería ver si había algún problema, el problema era que no estaba seguro de cómo enviar una intención desde el archivo Java a Kotlin expediente.

En este caso, creé una función estática en kotlin (objeto complementario), esta función obtiene un contexto (de la actividad actual) y devuelve la nueva intención mientras usa el contexto actual (contexto "java") mientras usa la clase kotlin (" :: class.java ").

Aquí está mi código:

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


De actividad en actividad

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

Del fragmento a la actividad

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


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