Зацикливание вызова функции кнопки [kotlin] - PullRequest
0 голосов
/ 22 декабря 2019

Я пытался закодировать свое первое приложение.

Расположение:

3 кнопки для управления 3 аудиопотоками, 1 кнопка для загрузки аудиопотока из файла.

Ожидаемое поведение:

  • При нажатии кнопки загрузки, за которой следует любая из трех других (управляющих) кнопок, должно появиться диалоговое окно выбора файла, и выбранный аудиофайл будет «назначен» соответствующей кнопке управления.
  • При нажатии навыделенная кнопка управления, и если назначенный звук длиннее 20 секунд, цвет кнопки должен измениться при новом выделении xml, и поток должен быть воспроизведен один раз. Когда поток уже воспроизводится, режим воспроизведения для этого потока должен измениться на бесконечный цикл. Еще одно нажатие приведет к остановке аудиопотока.

Подход. Кнопки управления в файле xml имеют ссылку на функцию «ControlOnClick», которая должна вызываться внутри основного действия. Кнопка загрузки имеет ссылку на «pickOnClick», которая только изменяет переменную состояния.

Состояние: сбор файлов в настоящее время исключен, чтобы сохранить сложность низкой. Для этого есть жестко запрограммированный заполнитель.

Вопрос: Как зациклить все три кнопки без необходимости копировать / вставлять регистр переключателя для каждой кнопки внутри «ControlOnClick»?

Макет layout_main.xml:

       <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="56dp"
        android:layout_marginBottom="52dp"
        android:onClick="ControlOnClick"
        android:text="Empty"
        app:layout_constraintBottom_toTopOf="@+id/nav_view"
        app:layout_constraintEnd_toEndOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="456dp"
        android:onClick="pickOnClick"
        android:text="Load audio"
        app:layout_constraintBottom_toTopOf="@+id/button1"
        app:layout_constraintEnd_toEndOf="parent" />

и функция длительности кнопки / звука в основной активности .kt:

    fun pickOnClick(v: View){
        // load button was pressed
        loadactive=true
    }

   fun ControlOnClick(v: View) {
        when (v.id) {
            // button1 was pressed
            R.id.button1 -> {
                if (loadactive == true) {
                    // load sound file if load button was pressed before, rename button1 and reset
                    sound1 = soundPool.load(this, meldeath1, 1)
                    // decide if it is a short or long clip
                    var resID = getResources().getIdentifier("meldeath1", "raw", getPackageName())
                    shortcliparray[1]=getSoundDuration(resID)
                    button1.text = "meldeath1"
                    if (shortcliparray[1]==false) {
                        button1.setBackgroundResource(R.drawable.btn_notplaying)
                    }
                    loadactive = false
                } else {
                    // play, loop or stop sound1
                    if (playbackstatus[1] == 0 && shortcliparray[1]==false) {
                        streamid[1] = soundPool.play(sound1, 1f, 1f, 0, 0, 1f)
                        button1.setBackgroundResource(R.drawable.btn_playing)
                        playbackstatus[1] = 1
                    } else if (playbackstatus[1] == 0 && shortcliparray[1]==true){
                        streamid[1] = soundPool.play(sound1, 1f, 1f, 0, 0, 1f)
                    } else if (playbackstatus[1] == 1 ) {
                        soundPool.stop(streamid[1])
                        streamid[1] = soundPool.play(sound1, 1f, 1f, 0, -1, 1f)
                        button1.setBackgroundResource(R.drawable.btn_looping)
                        playbackstatus[1] = 2
                    } else if (playbackstatus[1] == 2 ) {
                        soundPool.stop(streamid[1])
                        button1.setBackgroundResource(R.drawable.btn_notplaying)
                        playbackstatus[1] = 0
                    }
                }
            }

Я проверил довольно много других постов, но я не могу получить больше, основываясь на том, что я прочитал. :(

...