错误:找不到属性android:onProgressChanged。错误:链接文件资源失败

时间:2019-03-05 03:04:27

标签: android android-layout android-databinding

我正在尝试处理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

1 个答案:

答案 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),因此以上内容不适用。