ошибка: атрибут android: onProgressChanged не найден.ошибка: не удалось связать файловые ресурсы - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь обработать SeekBar событие onProgressChange.Я добавил android:onProgressChanged="onSeekBarChanged" в файл макета xml и функцию в моем файле Activity kotlin:

fun onSeekBarChanged(view: View) {
    Log.d(TAG, "on SeekBarChanged")
}

, но компилятор выдает следующее с ошибкой:

Не удалось связать ресурс Android / home/radek/AndroidStudioProjects/TestMediaStore/app/build/intermediates/incremental/mergeDebugResources/stripped.dir/layout/activity_songfile_list.xml:37: ошибка: атрибут android: onProgressChanged не найден.ошибка: не удалось связать файловые ресурсы.

Что я делаю не так?

Редактировать: Это также применимо к другим атрибутам событий от разных слушателей, таких как:

  • android:onLongClick
  • android:onStartTrackingTouch
  • android:onCheckedChanged
  • android:onTextChanged

Мой макет:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable name="viewModel" type="com.example.testmediastore.MyViewModel"/>
    </data>
<androidx.coordinatorlayout.widget.CoordinatorLayout    
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context=".SongFileListActivity">

    <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/app_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </com.google.android.material.appbar.AppBarLayout>

    <FrameLayout
            android:id="@+id/frameLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <include layout="@layout/songfile_list"/>
    </FrameLayout>

    <SeekBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content" android:id="@+id/seekbar_playback"
            android:progress="@{viewModel.playerProgress}"
            android:max="@{viewModel.playerProgressMax}"
            android:onProgressChanged="onSeekBarChanged"
            app:layout_behavior="@string/bottom_sheet_behavior"/>

    <fragment
            android:layout_width="wrap_content"
            android:layout_height="@dimen/play_control_height"
            android:name="com.example.testmediastore.PlayControlFragment"
            android:id="@+id/fragment"
            android:layout_gravity="bottom|center"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>

1 Ответ

0 голосов
/ 24 марта 2019

Это было совершенно неправильно: android:onProgressChanged="onSeekBarChanged"

Правильный путь:

android:onProgressChanged="@{viewModel::onSeekBarChanged}"

fun onSeekBarChanged(SeekBar seekBar, int progress, boolean fromUser) {
    Log.d(TAG, "on SeekBarChanged")
}

ИЛИ

android:onProgressChanged="@{() -> viewModel.onSeekBarChanged()}"

fun onSeekBarChanged() {
    Log.d(TAG, "on SeekBarChanged")
}

Первое решение называется ссылки на метод ( документация ).Подпись метода должна совпадать с сигнатурой соответствующего метода слушателя.В моем случае это было onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) из SeekBar.OnSeekBarChangeListener

Второй метод называется привязки слушателя .И вы можете опустить параметры метода.Но обратите внимание на возвращаемое значение:

Если событие, которое вы слушаете, возвращает значение, тип которого не равен void, ваши выражения также должны возвращать значение того же типа.Например, если вы хотите прослушивать событие длинного щелчка, ваше выражение должно возвращать логическое значение.

onProgressChanged Возвращаемое значение равно void (Kotlin Unit), так что вышене применимо.

...