Android : Kotlin : MVVM : 왜 viewModel.onButtonClicked ()가 앱 충돌을 일으키는가?
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")
}
}
답변
Logcat 메시지는 오해의 소지가 있습니다. 나는 그것이 근본 원인이라고 생각하는 다른 모든 것을 확인하는 데 몇 시간 동안 동일한 오류에 직면했습니다. 그러나이 특정 오류의 경우 "{}"를 주시하기 만하면됩니다. 이것은 안드로이드에서 데이터 바인딩의 단점 중 하나입니다. 컴파일 시간에 오류가 발생하지 않는 경우가 많습니다. 정말 도움이되지 않습니다!
그리고 고려해야 할 또 다른 것은
android:onClick = "@={() -> viewModel.onBtnClicked()}"
양방향 바인딩에 사용됩니다. 이 경우에는 필요하지 않습니다. Android 공식 문서에서 여기에서 읽을 수 있습니다.
android : onClick = "@ {()-> viewModel.onBtnClicked () } "
- 끝에 괄호를 추가하십시오.
- 또한 @ 뒤에 등호를 제거 할 수도 있습니다.