कोटलिन में "findViewById" करने में सक्षम नहीं है। त्रुटि "टाइप इंफ़ेक्शन विफल" हो रही है


80

जब मैं RecycleViewआईडी द्वारा खोजने की कोशिश कर रहा हूं तो मुझे निम्नलिखित त्रुटि हो रही है ।

त्रुटि: - प्रकार निष्कासन विफल: पैरामीटर टी के लिए पर्याप्त जानकारी नहीं

त्रुटि

कोड:

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

जवाबों:


101

कुछ इस तरह का प्रयास करें:

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

आप उसके लिए Kotlin Android Extensionsभी उपयोग कर सकते हैं । यहाँ डॉक्टर की जाँच करें
इसके साथ, आप recycler_viewसीधे अपने कोड में कॉल कर सकते हैं ।

कोटलिन Android एक्सटेंशन:

  • अपने ऐप में gradle.buildजोड़ेंapply plugin: 'kotlin-android-extensions'
  • अपनी कक्षा में आयात करें कि आपके लेआउट का फ़ाइल नाम import kotlinx.android.synthetic.main.<layout>.*कहां <layout>है।
  • यही है, आप recycler_viewसीधे अपने कोड में कॉल कर सकते हैं ।

यह कैसे काम करता है? पहली बार जब आप कॉल करते हैं recycler_view, तो कॉल findViewByIdकिया जाता है और कैश किया जाता है


नवीनतम संस्करण में मैं टाइप करने के लिए <> से चेतावनी दे रहा हूं। जैसा कि एंड्रॉइड स्टूडियो ने मुझे केवल हीरा ऑपरेटर का उपयोग करने के लिए मजबूर किया है <>जब मैं इसका उपयोग करता हूं तो यह त्रुटि दे रहा है।
आसिफ मुश्ताक

46

आप एपीआई स्तर 26 पर हैं, जहां की वापसी प्रकार findViewByIdअब के Tबजाय एक सामान्य है Viewऔर इसलिए इसका अनुमान लगाया जा सकता है। आप प्रासंगिक बदलाव का देख सकते हैं यहां

तो आपको ऐसा करने में सक्षम होना चाहिए:

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

या यह:

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

7

में Kotlinहम के उपयोग के बिना देखने की आईडी प्राप्त कर सकते हैं findViewByIdवाक्य रचना।

उदाहरण के लिए हम निम्नलिखित लेआउट का उपयोग कर रहे हैं जिससे हम दृश्य आईडी प्राप्त करेंगे और ऑपरेशन कर पाएंगे

ख़ाका

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

हम निम्नलिखित कोड का उपयोग करके दृश्य की आईडी खोजने में सक्षम हैं

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
}

कैसे?

इसका उपयोग करने में सक्षम होने के लिए, आपको एक विशेष आयात (जो मैं नीचे लिखता हूं) की आवश्यकता है, लेकिन आईडीई इसे ऑटो-आयात करने में सक्षम है। आसान नहीं हो सकता है!

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

हमें findviewbyidसिंटैक्स के उपयोग के बिना दृश्य की आईडी प्राप्त करने के लिए इस संपत्ति को आयात करने की आवश्यकता है ।

इस विषय पर अधिक जानकारी के लिए कृपया इस लिंक को देखें: - यहाँ क्लिक करें


1
शानदार समाधान! मेरी बहुत मदद की!
गुंडरबुर

7

आमतौर पर कोटलिन कोष्ठक में दी गई जानकारी का उपयोग करके अपने प्रकार का अनुमान लगा सकते हैं।

इस मामले में, ऐसा नहीं हो सकता है कि आपको इसे इस तरह स्पष्ट रूप से निर्दिष्ट करना होगा

findViewById<RecyclerView>(R.id.recycler_view)

वास्तव में इस प्रकार के बारे में निश्चित नहीं है, लेकिन यह है कि आपको इसे कैसे निर्दिष्ट करना चाहिए

मैं यह जोड़ना चाहूंगा कि, Anko का उपयोग करके , आप अपने कोड को इस तरह सरल बना सकते हैं:

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


2

आप कोटलिन में वैरिएबल को आईडी देने की उपेक्षा कर सकते हैं। आपको बस एक प्लगइन का उपयोग करने की आवश्यकता है

अपने ग्रेडेल में यह पेस्ट करें

 apply plugin: 'kotlin-android-extensions'

और फिर आपको आईडी के साथ आईडी असाइन करने की आवश्यकता नहीं है, आप इसे पसंद कर सकते हैं

 recycler_view.setAdapter(youradapter);

कृपया इसे मतदान करने का एक कारण बताएं।
अनमोल 317

1

इसे इस्तेमाल करे:

यहाँ bindजेनेरिक फ़ंक्शन का उपयोग दृश्य को बांधने के लिए किया जाता है। इसका सामान्य कार्य यह किसी भी दृश्य के लिए उपयोग कर सकता है।

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
Pls, अपने कोड में एक स्पष्टीकरण जोड़ें। कोड वाले उत्तर केवल हतोत्साहित करते हैं।
विली मेंजेल

1
जोड़ा गया। @WilliMentzel
मेहुल कबरिया

0

आपको चीजों को एक दृश्य के साथ करने के लिए कोई ऑब्जेक्ट बनाने की आवश्यकता नहीं है। आप बस आईडी का उपयोग कर सकते हैं। उदाहरण के लिए, कोटलिन

recycle_view.adapter = adapter

जावा के समान है

RecycleView recycle_view = (RecycleView) findViewById(recycle_view);
recycle_view.setAdapter(adapter);

0

ओपी सामना करना पड़ा जैसे ui घटकों का उपयोग करने में असमर्थ था नीचे की ओर app gradle के लिए आवश्यक था:

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

हालांकि इस पंक्ति को जोड़ने के बाद भी एंड्रॉइड स्टूडियो अभी भी कोटलिन सिंथेटिक्स के लिए आयात को हल करने में सक्षम नहीं था, इसलिए आपको कैश और पुनरारंभ करने की आवश्यकता हो सकती है।

यदि अभी भी काम नहीं कर रहा है तो विचारों के आधार पर मैन्युअल रूप से आयात करें

  • गतिविधि / विखंडन दृश्य: आयात kotlinx.android.synthetic.main। <your_activity_view> *।
  • सामान्य विचार: kotlinx.android.synthetic.main आयात करें। आपका your_layout_view। *।

अद्यतन - २

अगर आपको यह जानकारी मिल रही है -

चेतावनी: 'कोटलिन-एंड्रॉइड-एक्सटेंशन' ग्रेडल प्लगइन को हटा दिया गया है।

प्लगइन 'कोटलिन-एंड्रॉइड-एक्सटेंशन' को अपदस्थ करने जा रहा है। तो नीचे अपने ऐप ग्रेड में जोड़ें

android {
    ...
    buildFeatures {
        viewBinding true
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.