“FindViewById” in Kotlin nicht möglich. Fehlermeldung „Typrückschluss fehlgeschlagen“
Lesezeit: 5 Minuten
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
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
}
}
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)
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
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
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
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)
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