web-dev-qa-db-fra.com

Kotlin Android commence une nouvelle activité

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

}
56
J Adonai Dagdag

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)
104
Rahul

Tu peux essayer ça,

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

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)
    }
18
Leo Elstin

Essaye ça

val intent = Intent(this, Page2::class.Java)
startActivity(intent)
7
Boris

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)
})
6
Adib Faramarzi

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

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)
3
Alf Moh

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")
}
3
Bharat Vasoya

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)
2
Masum
val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.Java)
startActivity(intentAct)
1
ashishsonani

N'oubliez pas d'ajouter l'activité que vous souhaitez présenter à votre AndroidManifest.xml également :-) C'était le problème pour moi.

0
Nicolai Harbo

Détails

  • Android Studio 3.1.4
  • Version Kotlin: 1.2.60

Étape 1. Application ()

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

}

Étape 2. Ajouter un objet routeur

object Router {
    inline fun <reified T: Activity> start() {
         val context =  MY_APPLICATION_NAME.getAppContext()
         val intent = Intent(context, T::class.Java)
         context.startActivity(intent)
    }
}

Usage

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

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);
0
Anton Makov