我正在尝试处理SeekBar
的{{1}}事件。我已将onProgressChange
添加到xml布局文件并在我的Activity kotlin文件中进行了功能:
android:onProgressChanged="onSeekBarChanged"
但是编译器抛出以下错误:
Android资源链接失败 /home/radek/AndroidStudioProjects/TestMediaStore/app/build/intermediates/incremental/mergeDebugResources/stripped.dir/layout/activity_songfile_list.xml:37: 错误:找不到属性android:onProgressChanged。错误:失败 链接文件资源。
我在做什么错了?
编辑: 这也适用于来自不同侦听器的其他事件属性,例如:
fun onSeekBarChanged(view: View) {
Log.d(TAG, "on SeekBarChanged")
}
android:onLongClick
android:onStartTrackingTouch
android:onCheckedChanged
我的布局:
android:onTextChanged
答案 0 :(得分:0)
这是完全错误的:android:onProgressChanged="onSeekBarChanged"
正确的方法是:
android:onProgressChanged="@{viewModel::onSeekBarChanged}"
fun onSeekBarChanged(SeekBar seekBar, int progress, boolean fromUser) {
Log.d(TAG, "on SeekBarChanged")
}
OR
android:onProgressChanged="@{() -> viewModel.onSeekBarChanged()}"
fun onSeekBarChanged() {
Log.d(TAG, "on SeekBarChanged")
}
第一个解决方案称为方法引用(documentation)。方法的签名应与相应的侦听器的方法的签名相同。在我的情况下,它是onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
的{{1}}
第二种方法称为listener bindings。您可以省略方法的参数。但是要注意返回值:
如果您正在监听的事件返回一个类型不是 无效,您的表达式也必须返回相同类型的值。对于 例如,如果您想收听长按事件,则您的 表达式应返回布尔值。
SeekBar.OnSeekBarChangeListener
的返回值为onProgressChanged
(科特琳void
),因此以上内容不适用。