Kotlin에서 'findViewById'를 사용할 수 없습니다. "유형 추론 실패"오류가 발생합니다.


80

RecycleViewby id 를 찾으려고하면 다음과 같은 오류가 발생 합니다.

오류 :- 유형 추론 실패 : 매개 변수 T 를 추론하기에 정보가 충분하지 않습니다.

오류

암호:

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통해 코드에서 직접 호출 할 수 있습니다 .

Kotlin Android 확장 :

  • 앱에서 gradle.build추가apply plugin: 'kotlin-android-extensions'
  • 클래스 import kotlinx.android.synthetic.main.<layout>.*에서 <layout>레이아웃의 파일 이름이 어디에 있는지 가져 오기를 추가 하십시오.
  • 그게 전부 recycler_view입니다. 코드에서 직접 호출 할 수 있습니다 .

어떻게 작동합니까? 처음 호출 recycler_view하면에 대한 호출 findViewById이 수행되고 캐시 됩니다.


최신 버전에서는 <>에서 유형을 제거하라는 경고가 표시됩니다. Android 스튜디오에서 사용할 <>때 다이아몬드 연산자 만 사용하도록 강요 하므로 오류가 발생합니다.
Asif Mushtaq 2017

46

이제의 반환 유형이 대신 findViewById제네릭 이므로 추론 할 수 있는 API 레벨 26에 있습니다. 여기 에서 관련 변경 로그를 볼 수 있습니다 .TView

따라서 다음을 수행 할 수 있어야합니다.

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

아니면 이거:

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

7

에서 Kotlin우리의 사용하지 않고 뷰의 ID를 얻을 수 있습니다 findViewById구문.

예를 들어 다음 레이아웃을 사용하여 뷰의 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
}

어떻게?

이를 사용하려면 특수 가져 오기 (아래에 작성)가 필요하지만 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를 가져 오려면이 속성을 가져와야 합니다.

이 주제에 대한 자세한 내용은이 링크를 참조하십시오.- 여기를 클릭하십시오.


1
훌륭한 솔루션! 나를 많이 도왔다!
gundrabur

7

일반적으로 Kotlin은 괄호 안에 제공된 정보를 사용하여 유형을 추론 할 수 있습니다.

이 경우에는 그렇게 할 수 없으므로 다음과 같이 명시 적으로 지정해야합니다.

findViewById<RecyclerView>(R.id.recycler_view)

유형에 대해서는 확실하지 않지만 지정하는 방법입니다.

Anko를 사용 하여 다음과 같이 코드를 더욱 단순화 할 수 있습니다.

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


2

kotlin의 변수에 ID를 제공하는 것을 무시할 수 있습니다. 플러그인을 사용하면됩니다.

이것을 gradle에 붙여 넣으십시오.

 apply plugin: 'kotlin-android-extensions'

그런 다음 var에 ID를 할당 할 필요가 없습니다. 다음과 같이 할 수 있습니다.

 recycler_view.setAdapter(youradapter);

반대 투표에 대한 이유를 입력하십시오.
Anmol317

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, 코드에 설명을 추가하십시오. 코드로만 답변하는 것은 권장하지 않습니다.
Willi Mentzel

1
추가되었습니다. @WilliMentzel
Mehul Kabaria

0

보기로 작업을 수행하기 위해 개체를 만들 필요조차 없습니다. ID를 사용할 수 있습니다. 예 : Kotlin

recycle_view.adapter = adapter

Java 와 동일

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

0

OP와 같은 UI 구성 요소에 액세스 할 수 없었습니다. 앱 gradle 내부에 필요한 것처럼 보입니다.

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

이 줄을 추가 한 후에도 android studio는 여전히 kotlin 합성에 대한 가져 오기를 자동으로 해결할 수 없으므로 캐시를 무효화하고 다시 시작해야 할 수 있습니다.

여전히 작동하지 않으면보기에 따라 수동으로 가져 오기

  • 활동 / 단편보기 : import kotlinx.android.synthetic.main. <your_activity_view>. *
  • 일반보기 : import kotlinx.android.synthetic.main. <your_layout_view> .view. *

업데이트-2

이 정보 경고가 표시되는 경우-

경고 : 'kotlin-android-extensions'Gradle 플러그인은 더 이상 사용되지 않습니다.

플러그인 'kotlin-android-extensions'는 더 이상 사용되지 않습니다. 따라서 앱 gradle에 아래에 추가하십시오.

android {
    ...
    buildFeatures {
        viewBinding true
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.