"कोटलिन और एंड्रॉइड के साथ पैरामीटर टी के लिए पर्याप्त जानकारी नहीं"


110

मैं अपने एंड्रॉइड ऐप में निम्नलिखित लिस्ट व्यू को कोटलिन का उपयोग करके दोहराने की कोशिश कर रहा हूं: https://github.com/bidrohi/KotlinecistView

दुर्भाग्य से मुझे एक त्रुटि मिल रही है मैं खुद को हल करने में असमर्थ हूं। यहाँ मेरा कोड है:

MainActivity.kt:

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

    val listView = findViewById(R.id.list) as ListView
    listView.adapter = ListExampleAdapter(this)
}

private class ListExampleAdapter(context: Context) : BaseAdapter() {
    internal var sList = arrayOf("Eins", "Zwei", "Drei")
    private  val mInflator: LayoutInflater

    init {
        this.mInflator = LayoutInflater.from(context)
    }

    override fun getCount(): Int {
        return sList.size
    }

    override fun getItem(position: Int): Any {
        return sList[position]
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
        val view: View?
        val vh: ListRowHolder

        if(convertView == null) {
            view = this.mInflator.inflate(R.layout.list_row, parent, false)
            vh = ListRowHolder(view)
            view.tag = vh
        } else {
            view = convertView
            vh = view.tag as ListRowHolder
        }

        vh.label.text = sList[position]
        return view
    }
}

private class ListRowHolder(row: View?) {
    public val label: TextView

    init {
        this.label = row?.findViewById(R.id.label) as TextView
    }
}
}

लेआउट बिल्कुल यहाँ हैं: https://github.com/bidrohi/KotlinListView/tree/master/app/src/main/res/layout

पूर्ण त्रुटि संदेश जो मुझे मिल रहा है वह यह है: त्रुटि: (92, 31) प्रकार का निष्कासन विफल रहा: इनफ खोज में पैरामीटर टी का पर्याप्त जानकारी नहीं मिल रहा है ViewById (p0: Int): T! कृपया इसे स्पष्ट रूप से निर्दिष्ट करें।

मुझे जो भी मदद मिल सकती है मैं उसकी सराहना करूँगा।


2
आप को बदलने की कोशिश कर सकते this.label = ... as TextViewकरने के लिए this.label = row?.findViewById<TextView>और के लिए बहुत तुलनात्मक रूप से करते हैं val listView = ...? कृपया मुझे बताएं कि क्या यह काम करता है तो मैं इसे उस मामले में उचित जवाब दे सकता हूं।
क्रिश्चियन ब्रुग्मेन्न

1
कौन सी रेखा त्रुटि का कारण बनती है?
वोददान

क्या आप एक छोटे से उदाहरण के साथ समस्या का प्रदर्शन कर सकते हैं?
वोददान

@ ChristianBrüggemann इस तरह: i.imgur.com/ZeWKjt5.png और यह: i.imgur.com/Can7w0p.png ? आपके संपादन के साथ अब ये त्रुटियां हैं: i.imgur.com/qqPAjrL.png
टिमो गुंटनर

1
इसे आज़माएँ। इस पर क्लिक करें। पंक्ति = .findViewById <TextView> (R.id.label) पाठ दृश्य के रूप में
अल्फ मो

जवाबों:


224

आपको API स्तर 26 (या उससे ऊपर) का उपयोग करना चाहिए। इस संस्करण ने हस्ताक्षर बदल दिए हैं View.findViewById()- यहाँ देखें https://developer.android.com/about/versions/oreo/android-8.0-changes#fvbi-signature

तो आपके मामले में, जहां परिणाम findViewByIdअस्पष्ट है, आपको प्रकार की आपूर्ति करने की आवश्यकता है:

1 / बदलें

val listView = findViewById(R.id.list) as ListView सेवा

val listView = findViewById<ListView>(R.id.list)

2 / बदलें

this.label = row?.findViewById(R.id.label) as TextView सेवा

this.label = row?.findViewById<TextView>(R.id.label) as TextView

ध्यान दें कि 2 / कलाकारों में केवल आवश्यक है क्योंकि rowअशक्त है। यदि label वह अशक्त भी था, या यदि आप rowअशक्त नहीं थे, तो इसकी आवश्यकता नहीं होगी।


10
यहां बताया गया है कि इसे कैसे हल किया जाए: रिप्लेसमेंट इन पाथ डायलॉग (Ctrl + Shift + R) खोलें और regex बॉक्स को चेक करें। के findViewById\((.+?)\)\s+as\s+(.+)साथ बदलें findViewById<$2>\($1\)और सभी फ़ाइलों पर प्रतिस्थापित चलाएँ। इसने मेरी लगभग सभी त्रुटियों को हल कर दिया।
गुस्ताव कार्लसन

1
जावा में डिफ़ॉल्ट रूप से व्यू टाइप करने के लिए पर्याप्त और कोटलिन में पर्याप्त क्यों नहीं है? findViewById(R.id.tabLayout).setOnClickListener(v-> Log.d(TAG, "login: "));यह जावा के लिए ठीक है।
uTha9

findViewById\((.+?)\)\s+as\s+([A-Za-z0-9?]+)मेरे लिए बेहतर काम करता है। यह रोकता है कुछ एक लाइन कोड @GustavKarlsson से अधिक नहीं है
user3680200

1
लिंक ऐसा नहीं कहता है।
अल्स्टन

7

एंड्रॉइड ओ परिवर्तन findViewById एपीआई से

सार्वजनिक दृश्य findViewById (int id);

सेवा

सार्वजनिक अंतिम T findViewById (इंट आईडी)

इसलिए, यदि आप API 26 पर लक्षित हैं, तो आप बदल सकते हैं

सूची के रूप में val listView = findViewById (R.id.list)

सेवा

वैल लिस्ट व्यू = findViewById (R.id.list)

या

val listView: सूची दृश्य = findViewById (R.id.list)


4

यह काम कर रहा है

एपीआई स्तर 25 या उससे नीचे का उपयोग करें

    var et_user_name = findViewById(R.id.et_user_name) as EditText

एपीआई स्तर 26 या इसके बाद के संस्करण का उपयोग करें

    val et_user_name: EditText = findViewById(R.id.et_user_name)

हैप्पी कोडिंग!


2

इसमें अपना कोड बदलें। जहां मुख्य परिवर्तन हुए हैं वे तारांकन के साथ चिह्नित हैं।

package com.phenakit.tg.phenakit

import android.content.Context
import android.os.Bundle
import android.support.design.widget.BottomNavigationView
import android.support.v7.app.AppCompatActivity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ListView
import android.widget.TextView

public class MainActivity : AppCompatActivity() {

    private var mTextMessage: TextView? = null

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
                mTextMessage!!.setText(R.string.title_home)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_dashboard -> {
                mTextMessage!!.setText(R.string.title_dashboard)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_notifications -> {
                setContentView(R.layout.activity_list_view)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

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

        mTextMessage = findViewById(R.id.message) as TextView?
        val navigation = findViewById(R.id.navigation) as BottomNavigationView
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)


        **val listView = findViewById<ListView>(R.id.list)**



        **listView?.adapter = ListExampleAdapter(this)**
    }

    private class ListExampleAdapter(context: Context) : BaseAdapter() {
        internal var sList = arrayOf("Eins", "Zwei", "Drei")
        private  val mInflator: LayoutInflater

        init {
            this.mInflator = LayoutInflater.from(context)
        }

        override fun getCount(): Int {
            return sList.size
        }

        override fun getItem(position: Int): Any {
            return sList[position]
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
            val view: View?
            val vh: ListRowHolder

            if(convertView == null) {
                view = this.mInflator.inflate(R.layout.list_row, parent, false)
                vh = ListRowHolder(view)
                view.tag = vh
            } else {
                view = convertView
                vh = view.tag as ListRowHolder
            }

            vh.label.text = sList[position]
            return view
        }
    }

    private class ListRowHolder(row: View?) {
        public var label: TextView

        **init { this.label = row?.findViewById<TextView?>(R.id.label) as TextView }**
    }
}

यदि आप अपने ऐप में एपीआई 26 को लक्षित कर रहे हैं, तो नीचे दिया गया उत्तर सही उत्तर है। val listView = findViewById<ListView>(R.id.list)
EricWasTaken

@ericWasTaken हाँ, आप सही हैं। कंपाइलर को कोष्ठक में मौजूद सामग्री से टाइप करना है। कभी-कभी उस पर विफल रहता है। आपका कोड भी सही है। परिवर्तनों को प्रतिबिंबित करने के लिए मेरे उत्तर को अपडेट करेगा।
अल्फ मोह

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