“FindViewById” in Kotlin nicht möglich. Fehlermeldung „Typrückschluss fehlgeschlagen“

Lesezeit: 5 Minuten

Benutzer-Avatar
Ravindra Kushwaha

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

Fehler:-
Typableitung fehlgeschlagen: Nicht genügend Informationen, um Parameter abzuleiten T

Fehler

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

Benutzer-Avatar
Kevin Robatel

Versuchen Sie etwas wie:

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

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

Kotlin Android-Erweiterungen:

  • In Ihrer Anwendung gradle.build hinzufügen apply plugin: 'kotlin-android-extensions'
  • Fügen Sie in Ihrer Klasse import for hinzu import kotlinx.android.synthetic.main.<layout>.* wo <layout> ist der Dateiname Ihres Layouts.
  • Das war’s, du kannst anrufen recycler_view direkt in Ihrem Code.

Wie funktioniert es? Das erste Mal, dass Sie anrufen recycler_viewein Anruf bei findViewById ist fertig und zwischengespeichert.

  • In der neuesten Version erhalte ich eine Warnung, den Typ aus <> zu entfernen. Als Android-Studio zwingt es mich, nur den Diamond-Operator zu verwenden <> Wenn ich es dann benutze, gibt es Fehler.

    – Asif Mushtaq

    28. Dezember 2017 um 17:24 Uhr

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

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)

Benutzer-Avatar
Ravindra Kushwaha

VERALTET

Im Kotlin Wir können die ID der Ansicht ohne die Verwendung von erhalten findViewById Syntax.

Zum Beispiel verwenden wir das folgende Layout, von 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 finden

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. Einfacher geht es nicht!

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 von zu erhalten findviewbyid Syntax.

Weitere Informationen zu diesem Thema finden Sie unter diesem Link :- Klick hier

AKTUALISIEREN

Jetzt sind die kotlin-android-extensions veraltet, anstatt die von kotlin bereitgestellte Bindung zu verwenden, können wir jetzt die verwenden Ansichtsbindung und es funktioniert genauso wie die obige Lösung. Sie müssen nur das Folgende in Ihrem App-Gradle verwenden

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

  • Geniale Lösung! Hat mir viel geholfen!

    – Gundrabur

    25. August 2019 um 16:13 Uhr

  • Gibt es einen Nachteil bei der Verwendung dieser Lösung? Die Lösung sieht gut aus und kann den Code viel sauberer machen.

    – lkdhruw

    8. Oktober 2021 um 9:07 Uhr

  • @Ikdhruw Sie können auch die Ansichtsbindung verwenden, da ich die Lösung oben aktualisiert habe

    – Ravindra Kushwaha

    12. Oktober 2021 um 15:08 Uhr

Benutzer-Avatar
Alf Moh

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

In diesem Fall ist dies nicht möglich, sodass Sie dies explizit so angeben müssten

findViewById<RecyclerView>(R.id.recycler_view)

Ich bin mir zwar nicht sicher über den Typ, aber so sollten Sie ihn angeben

Ich möchte das hinzufügen, indem ich verwende Ankokönnen Sie Ihren Code wie folgt weiter vereinfachen:

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

Fügen Sie diese Zeile für Ihren Code als Controller hinzu, den Sie verwenden.

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

Benutzer-Avatar
Anmol317

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

Fügen Sie dies in Ihre Note ein

 apply plugin: 'kotlin-android-extensions'

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

 recycler_view.setAdapter(youradapter);

Es war nicht möglich, auf die UI-Komponenten zuzugreifen, da das Aussehen von OP wie unten in App Gradle benötigt wurde:

plugins {
    ...
    id 'kotlin-android-extensions'
}

Obwohl Android Studio nach dem Hinzufügen dieser Zeile die Importe für Kotlin Synthetics immer noch nicht automatisch auflösen konnte, müssen Sie möglicherweise den Cache ungültig machen und neu starten.

Wenn es immer noch nicht funktioniert, importieren Sie es je nach Ansicht manuell

  • Aktivitäts-/Fragmentansicht: import kotlinx.android.synthetic.main..*
  • normale Ansichten: import kotlinx.android.synthetic.main..view.*

Aktualisierung – 2

Wenn Sie diese Info-Warnung erhalten –

Warnung: Das Gradle-Plugin „kotlin-android-extensions“ ist veraltet.

Das Plugin „kotlin-android-extensions“ wird veraltet sein. Fügen Sie also unten in Ihrem App-Gradle hinzu

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

1317850cookie-check“FindViewById” in Kotlin nicht möglich. Fehlermeldung „Typrückschluss fehlgeschlagen“

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy