[android] Kotlin에서 ‘findViewById’를 사용할 수 없습니다. “유형 추론 실패”오류가 발생합니다.

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



답변

다음과 같이 시도하십시오.

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이 수행되고 캐시 됩니다.


답변

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

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

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

아니면 이거:

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


답변

에서 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를 가져 오려면이 속성을 가져와야 합니다.

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


답변

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

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

findViewById<RecyclerView>(R.id.recycler_view)

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

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

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


답변

코드에이 줄을 Whatever you are using controller로 추가합니다.

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


답변

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

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

 apply plugin: 'kotlin-android-extensions'

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

 recycler_view.setAdapter(youradapter);


답변

이 시도:

여기에 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
}