wake-up-neo.com

Kann "findViewById" in Kotlin nicht finden. Fehler beim Abrufen der Typeninferenz fehlgeschlagen

Ich erhalte die folgende Fehlermeldung, wenn ich versuche, eine RecycleView anhand der ID zu finden.

Error:- Typinferenz fehlgeschlagen: Nicht genügend Informationen, um Parameter T abzuleiten.

 Error

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

Versuchen Sie etwas wie:

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

Sie können auch Kotlin Android Extensions dafür verwenden. Überprüfen Sie das Dokument hier .
Damit können Sie recycler_view direkt in Ihrem Code aufrufen.

Kotlin Android Extensions:

  • In Ihrer App gradle.build hinzufügen apply plugin: 'kotlin-Android-extensions'
  • Fügen Sie in Ihrer Klasse import für import kotlinx.Android.synthetic.main.<layout>.* hinzu, wobei <layout> der Dateiname Ihres Layouts ist.
  • Das ist es, Sie können recycler_view direkt in Ihrem Code aufrufen.

Wie funktioniert es? Wenn Sie recycler_view zum ersten Mal aufrufen, wird ein Aufruf an findViewById durchgeführt und zwischengespeichert.

83
Kevin Robatel

Sie befinden sich auf API-Ebene 26, wo der Rückgabetyp von findViewById jetzt eine generische T anstelle von View ist und daher abgeleitet werden kann. Sie können das entsprechende Änderungsprotokoll hier sehen.

Das solltest du also können:

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

Oder dieses:

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

Normalerweise kann Kotlin anhand der in den Klammern angegebenen Informationen auf Ihren Typ schließen.

In diesem Fall kann dies nicht explizit angegeben werden 

findViewById<RecyclerView>(R.id.recycler_view)

Nicht wirklich sicher über den Typ, aber so sollten Sie ihn angeben 

Ich möchte hinzufügen, dass Sie mit Anko Ihren Code folgendermaßen vereinfachen können:

val recycler_view : RecyclerView =  find(R.id.recycler_view)
6
Alf Moh

In Kotlin können wir die ID der Ansicht ohne Verwendung der findViewById-Syntax abrufen.

Zum Beispiel verwenden wir das folgende Layout, aus dem wir die ID der Ansicht erhalten und die Operation ausführen 

Layout

<?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>

Wir können die ID der Ansicht mithilfe des folgenden Codes ermitteln

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
}

WIE?

Um es verwenden zu können, benötigen Sie einen speziellen Import (den ich unten schreibe), aber die IDE kann ihn automatisch importieren. Könnte nicht einfacher sein

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

Wir müssen diese Eigenschaft importieren, um die ID der Ansicht ohne die Verwendung der findviewbyid-Syntax zu erhalten.

Weitere Informationen zu diesem Thema finden Sie hier: - Klicken Sie hier

5

Fügen Sie diese Zeile für Ihren Code als "Was auch immer Sie Controller verwenden" hinzu.

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

Versuche dies:

Hier wird die bind generische Funktion verwendet, um die Ansicht zu binden. Seine allgemeine Funktion kann für jede Ansicht verwendet werden.

class MyActivity : AppCompatActivity() {
    private lateinit var recycler_view : RecyclerView
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        recycler_view = bind(R.id.recycler_view)
    }
}

fun <T : View> Activity.bind(@IdRes res : Int) : T {
    @Suppress("UNCHECKED_CAST")    
    return findViewById(res) as T
}
1
Mehul Kabaria

Sie können die Angabe von IDs zu Variablen in Kotlin ignorieren. Sie müssen nur ein Plugin verwenden

Fügen Sie dies in Ihrem Gradle ein

 apply plugin: 'kotlin-Android-extensions'

und dann müssen Sie var keine ids zuweisen, Sie können es einfach machen

 recycler_view.setAdapter(youradapter);
0
Anmol

Sie müssen nicht einmal ein Objekt erstellen, um Dinge mit einer Ansicht zu erledigen. Sie können die ID einfach verwenden. Zum Beispiel Kotlin

recycle_view.adapter = adapter

ist dasselbe wie Java

RecycleView recycle_view = (RecycleView) findViewById(recycle_view);
recycle_view.setAdapter(adapter);
0
Ajay Sivan

Code: Eine andere Möglichkeit, dies zu tun.

class KotlinActivity : AppCompatActivity() {


        var recycler_view: RecyclerView? = null

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

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


        }
    }
0
Siddhant Patil