102 votes

Impossible de "findViewById" dans Kotlin. Obtention de l'erreur "Echec de l'inférence de type"

Je reçois le message d'erreur suivant lorsque j'essaie de trouver un RecycleView par identifiant.

Erreur: - Echec de l'inférence de type: informations insuffisantes pour déduire le paramètre T

Erreur

Code:

 class FirstRecycleViewExample : AppCompatActivity() {
    val data = arrayListOf<String>()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.first_recycleview)

        val recycler_view =  findViewById(R.id.recycler_view) as RecyclerView ///IN THIS LINE I AM GETTING THE ERROR

        data.add("First Data")
        data.add("Second Data")
        data.add("Third Data")
        data.add("Forth Data")
        data.add("Fifth Data")

        //creating our adapter
        val adapter = CustomRecycleAdapter(data)

        //now adding the adapter to recyclerview
        recycler_view.adapter = adapter
    }
}
 

138voto

Kevinrob Points 416

Essayez quelque chose comme:

val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)

Vous pouvez utiliser Kotlin Android Extensions trop pour cela. De vérifier la doc ici.
Avec elle, vous pouvez appeler recycler_view directement dans votre code.

Kotlin Android Extensions:

  • Dans votre application, gradle.build ajouter apply plugin: 'kotlin-android-extensions'
  • Dans votre classe, ajoutez de l'importation pour l' import kotlinx.android.synthetic.main.<layout>.*<layout> est le nom de fichier de votre mise en page.
  • Ça y est, vous pouvez appeler recycler_view directement dans votre code.

Comment ça fonctionne? La première fois que vous appelez recycler_view, un appel à l' findViewById est fait et mis en cache.

50voto

zsmb13 Points 36441

Vous êtes au niveau API 26, où le type de retour findViewById est maintenant un générique T au lieu de View et peut donc être déduit. Vous pouvez voir le journal des modifications correspondant ici .

Donc, vous devriez pouvoir faire ceci:

 val recycler_view = findViewById<RecyclerView>(R.id.recycler_view)
 

Ou ca:

 val recycler_view: RecyclerView = findViewById(R.id.recycler_view)
 

20voto

Ravindra Kushwaha Points 3516

En Kotlin nous pouvons obtenir l'id de la vue sans l'utilisation de l' findViewById de la syntaxe.

Pour exemple, nous utilisons la suite de la mise en page à partir de qui nous permettra d'obtenir l'id de la vue et effectuer l'opération

Mise en page

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/welcomeMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Hello World!"/>

</FrameLayout>

Nous sommes en mesure de trouver l'id de la vue en utilisant le code suivant

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    welcomeMessage.text = "Hello Kotlin!" ////WE ARE GETTING THE IDS WITHOUT USING THE FINDVIEWBYID syntax
}

COMMENT?

Pour être en mesure de l'utiliser, vous avez besoin d'une spéciales d'importation (celui que j'ai écris ci-dessous), mais l'IDE est capable d'auto-importer. Ne pouvait pas être plus facile!

import kotlinx.android.synthetic.main.YOUR_LAYOUT_NAME.*/// HERE "YOUR_LAYOUT_NAME" IS YOUR LAYOUT NAME WHICH U HAVE INFLATED IN onCreate()/onCreateView() 

Nous avons besoin d'importer cette propriété afin d'obtenir l'id de la vue sans l'utilisation de l' findviewbyid de la syntaxe.

Pour plus d'informations sur ce sujet que veuillez consulter ce lien :- Cliquez ici

8voto

Alf Moh Points 3265

Habituellement, Kotlin peut déduire votre type en utilisant les informations fournies entre parenthèses.

Dans ce cas, il ne peut pas vous obliger à le spécifier explicitement comme ceci

 findViewById<RecyclerView>(R.id.recycler_view)
 

Pas vraiment sûr du type, mais c'est comme ça que vous devriez le spécifier

J'aimerais ajouter que, en utilisant Anko , vous pouvez encore simplifier votre code comme ceci:

 val recycler_view : RecyclerView =  find(R.id.recycler_view)
 

7voto

Ajoutez cette ligne pour votre code en tant que tout ce que vous utilisez le contrôleur.

 val tvHello = findViewById<TextView>(R.id.tvHello)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X