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)