web-dev-qa-db-ja.com

Kotlinで「findViewById」を実行できません。 「型推論に失敗しました」というエラーが表示される

IDでRecycleViewを見つけようとすると、次のエラーが表示されます。

エラー:-型推論に失敗しました:パラメーターを推論するための十分な情報がありませんT

Error

コード:

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

次のようなものを試してください:

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

そのためにKotlin Android Extensionsも使用できます。ドキュメントを確認してください こちら
これを使用すると、コード内でrecycler_viewを直接呼び出すことができます。

Kotlin Android Extensions:

  • アプリにgradle.buildを追加しますapply plugin: 'kotlin-Android-extensions'
  • クラスにimport kotlinx.Android.synthetic.main.<layout>.*のインポートを追加します。ここで<layout>はレイアウトのファイル名です。
  • それだけです。コードでrecycler_viewを直接呼び出すことができます。

どのように機能しますか? recycler_viewを初めて呼び出すと、findViewByIdの呼び出しが行われ、cachedが実行されます。

85
Kevin Robatel

APIレベル26で、findViewByIdの戻り値の型がTの代わりに汎用Viewになったため、推測できるようになりました。関連する変更ログを見ることができます here

だからあなたはこれを行うことができるはずです:

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

またはこれ:

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

通常、Kotlinは括弧内の情報を使用してタイプを推測できます。

この場合、できませんので、このように明示的に指定する必要があります

findViewById<RecyclerView>(R.id.recycler_view)

タイプについては確かではありませんが、それはあなたがそれを指定する方法です

Anko を使用して追加したいので、次のようにコードをさらに単純化できます。

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

Kotlinでは、findViewById構文を使用せずにビューのIDを取得できます。

たとえば、ビューのIDを取得して操作を実行するレイアウトを次のように使用しています

レイアウト

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

次のコードを使用して、ビューのIDを見つけることができます

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
}

HOW?

使用できるようにするには、特別なインポート(以下に記述するもの)が必要ですが、IDEはそれを自動インポートできます。簡単にできませんでした!

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

findviewbyid構文を使用せずにビューのIDを取得するには、このプロパティをインポートする必要があります。

このトピックの詳細については、このリンクを参照してください:- ここをクリック

5

コントローラーを使用しているものとして、コードにこの行を追加します。

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

これを試して:

ここで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
Mehul Kabaria

Kotlinの変数にIDを与えることは無視できます。プラグインを使用するだけです

これをGradleに貼り付けます

 apply plugin: 'kotlin-Android-extensions'

そして、あなたはvarにidを割り当てる必要はありません、あなたはちょうどそれをすることができます

 recycler_view.setAdapter(youradapter);
0
Anmol

ビューで物事を行うためにオブジェクトを作成する必要さえありません。あなただけのIDを使用することができます。たとえば、Kotlin

recycle_view.adapter = adapter

Javaと同じ

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

コード:別の方法。

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