Android : Kotlin : MVVM : 왜 viewModel.onButtonClicked ()가 앱 충돌을 일으키는가?

Sep 02 2020

Logcat 메시지 :

java.lang.IllegalStateException : ID가 '인 view class androidx.appcompat.widget.AppCompatButton에 정의 된 android : onClick 속성에 대한 상위 또는 상위 컨텍스트에서 @ = {()-> viewModel.onBtnClicked () (View) 메소드를 찾을 수 없습니다. 단추'

파일 1 : activity_main.xml

<data>
    <variable
        name="viewModel"
        type="com.wingsquare.databindingdemo.MainViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick = "@={() -> viewModel.onBtnClicked()"
        />
</androidx.constraintlayout.widget.ConstraintLayout>

파일 2 : MainActivity.kt

class MainActivity : AppCompatActivity () {fun onCreate (savedInstanceState : Bundle?) {super.onCreate (savedInstanceState) 재정의

    val binding: ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)

    // val binding = ActivityMainBinding.inflate(layoutInflater)
    val mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
    binding.viewModel = mainViewModel
    binding.lifecycleOwner = this
}

}

파일 3 : MainViewModel.kt

class MainViewModel : ViewModel () {

fun onBtnClicked() {
    Log.d("MainViewModel", "MainViewModel")
}

}

답변

ArMot Sep 02 2020 at 08:15

Logcat 메시지는 오해의 소지가 있습니다. 나는 그것이 근본 원인이라고 생각하는 다른 모든 것을 확인하는 데 몇 시간 동안 동일한 오류에 직면했습니다. 그러나이 특정 오류의 경우 "{}"를 주시하기 만하면됩니다. 이것은 안드로이드에서 데이터 바인딩의 단점 중 하나입니다. 컴파일 시간에 오류가 발생하지 않는 경우가 많습니다. 정말 도움이되지 않습니다!

그리고 고려해야 할 또 다른 것은

android:onClick = "@={() -> viewModel.onBtnClicked()}"

양방향 바인딩에 사용됩니다. 이 경우에는 필요하지 않습니다. Android 공식 문서에서 여기에서 읽을 수 있습니다.

هيثم Sep 02 2020 at 07:58

android : onClick = "@ {()-> viewModel.onBtnClicked () } "

  • 끝에 괄호를 추가하십시오.
  • 또한 @ 뒤에 등호를 제거 할 수도 있습니다.