Je veux commencer une autre activité sur Android mais j'obtiens cette erreur:
Veuillez spécifier l'invocation du constructeur; le classificateur 'Page2' n'a pas d'objet compagnon
après instanciation de la classe Intent
. Que dois-je faire pour corriger l'erreur? Mon code:
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)
}
}
Pour démarrer une Activity
en Java, nous avons écrit Intent(this, Page2.class)
. En gros, vous devez définir Context
dans le premier paramètre et la classe de destination dans le second paramètre. Selon la méthode Intent
dans le code source -
public Intent(Context packageContext, Class<?> cls)
Comme vous pouvez le constater, nous devons passer Class<?>
au deuxième paramètre.
En écrivant Intent(this, Page2)
nous ne spécifions jamais que nous allons passer classe, nous essayons de passer le type class
qui n’est pas acceptable.
Utilisez ::class.Java
qui est une alternative à .class
dans kotlin. Utilisez le code ci-dessous pour démarrer votre Activity
Intent(this, Page2::class.Java)
Exemple -
val intent = Intent(this, NextActivity::class.Java)
// To pass any data to next activity
intent.putExtra("keyIdentifier", value)
// start your next activity
startActivity(intent)
Tu peux essayer ça,
val intent = Intent(this, SecondActivity::class.Java)
intent.putExtra("key", value)
startActivity(intent)
Pour commencer une nouvelle activité,
startActivity(Intent(this@CurrentClassName,RequiredClassName::class.Java)
Alors changez votre code pour:
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)
}
Essaye ça
val intent = Intent(this, Page2::class.Java)
startActivity(intent)
Vous devez donner le deuxième argument de type classe. Vous pouvez également l'avoir un peu plus soigné comme ci-dessous.
startActivity(Intent(this, Page2::class.Java).apply {
putExtra("extra_1", value1)
putExtra("extra_2", value2)
putExtra("extra_3", value3)
})
Vous pouvez généralement simplifier la spécification du paramètre BlahActivity::class.Java
en définissant une fonction générique réifiée en ligne.
inline fun <reified T: Activity> Context.createIntent() =
Intent(this, T::class.Java)
Parce que cela vous permet de faire
startActivity(createIntent<Page2>())
Ou même plus simple
inline fun <reified T: Activity> Activity.startActivity() {
startActivity(createIntent<T>())
}
Alors c'est maintenant
startActivity<Page2>()
En effet, votre classe Page2
ne possède pas d'objet compagnon semblable à static
en Java, vous devez donc utiliser votre classe. Pour passer votre classe comme argument à Intent
, vous devrez faire quelque chose comme ceci
val changePage = Intent(this, Page2::class.Java)
Ceci est mon activité principale où je prends le nom d'utilisateur et le mot de passe d'éditer le texte et le paramétrage à l'intention
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);
}
}
C'est ma deuxième activité où je dois recevoir des valeurs de l'activité principale
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")
}
D'activité en activité
val intent = Intent(this, YourActivity::class.Java)
startActivity(intent)
De fragment en activité
val intent = Intent(activity, YourActivity::class.Java)
startActivity(intent)
val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.Java)
startActivity(intentAct)
N'oubliez pas d'ajouter l'activité que vous souhaitez présenter à votre AndroidManifest.xml
également :-) C'était le problème pour moi.
Obtenir un lien vers le contexte de votre 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()
}
}
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>()
J'avais un problème similaire, j'ai commencé à écrire mon application dans Kotlin. Après avoir réécrit l'une de mes activités, je voulais voir s'il y avait des problèmes. Le problème était que je ne savais pas comment envoyer une intention d'un fichier Java à kotlin. fichier.
Dans ce cas, j'ai créé une fonction statique dans kotlin (objet compagnon). Cette fonction obtient un contexte (de l'activité actuelle) et renvoie la nouvelle intention tout en utilisant le contexte actuel (contexte "Java") tout en utilisant la classe kotlin (" :: class.Java ").
Voici mon code:
//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);