Как вызвать макет из другого класса в Kotlin (Android)? - PullRequest
0 голосов
/ 30 марта 2020

Я сейчас работаю над проектом Android (Kotlin). По сути, это аудиоплеер, который отображает и воспроизводит все аудиофайлы, сохраненные на устройстве.

Проигрыватель состоит из фрагмента Kotlin (PlaylistFragment.kt), соответствующего файла макета (frag_play_list. xml) и специального класса Kotlink (PlayMusicService.kt) для воспроизведения отдельных файлов. Для оптической иллюстрации макета фрагмента (frag_play_list), пожалуйста, проверьте вложение. Справа внизу вы можете увидеть несколько кнопок управления (предыдущая, воспроизведение, остановка и следующая).

Было бы абсолютно без проблем обратиться к этим кнопкам непосредственно в соответствующем классе kotlin (PlayListFragment).

Проблема или проблема всего этого в том, что я хочу обратиться к этим четырем кнопкам в другом файле - в файле PlayMusicService-File. Этот файл находится в другом каталоге и не имеет доступа к файлу макета.

Ниже вы можете увидеть файл PlayMusicService.kt. Как вы можете видеть, есть только некоторые логи c для воспроизведения аудиофайлов и поиска файла nex в списке. Но, как я уже сказал, я хочу получить доступ к кнопкам управления звуком.

var currentPos: Int = 0
var musicDataList: ArrayList<String> = ArrayList()
var mp: MediaPlayer? = null
var counter: Int = 0
var flag: Int = 0
var newPosition: Int = 0



override fun onBind(intent: Intent?): IBinder? {
    return null
}


override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

    currentPos = intent!!.getIntExtra(SongListAdapter.MUSICITEMS, 0)
    musicDataList = intent!!.getStringArrayListExtra(SongListAdapter.MUSICLIST)
    counter++

    val musicDataListSize = musicDataList.size / counter

    Log.e("Log:", "The size of the audio file list is: $musicDataListSize")

    // beim auswählen eines neuen songs wird der gegenwärtige gestoppt
    if (mp != null) {
        mp!!.stop()
        mp!!.release()
        mp = null
    }

    Log.e("Log:", "Round $flag")

    mp = MediaPlayer()
    Log.e("Log ", "The id $currentPos is clicked.")

    mp!!.setDataSource(musicDataList[currentPos])
    mp!!.prepare()
    mp!!.setOnPreparedListener {
        mp!!.start()
        mp!!.setOnCompletionListener {
            mp!!.stop()
            flag=1
            playNextSong(flag, currentPos, musicDataListSize)
        }
    }
    return super.onStartCommand(intent, flags, startId)
}


// Find the next song
fun playNextSong(flag:Int, currentPos:Int, listSize:Int){
    var flag1 = flag;
    var currentPos1 = currentPos
    var listSize1:Int = listSize

    Log.e("Log: ", "Function is called: (flag: $flag1, currentPos: $currentPos1, listSize: $listSize1")
    Log.e("Log: ", "New position is $newPosition")

    newPosition = (currentPos1+flag1).toInt()
    mp = MediaPlayer()
    mp!!.setDataSource(musicDataList[newPosition])
    mp!!.prepare()
    mp!!.setOnPreparedListener {
        mp!!.start()
        mp!!.setOnCompletionListener{
            mp!!.stop()
            flag1 += 1

            //check if the end is reached
            var nextPos = (flag1+currentPos).toInt()

            if (nextPos >= listSize)
            {
                Log.e("Log: ", "This is the end")
                flag1 = 0
                //starting the loop again and again
            }

            // take next song
            else
            {
                playNextSong(flag1, currentPos, listSize)
            }
        }
    }
}

Я хотел бы сделать кнопки управления доступными с помощью функции findViewById (R.id ...).

Что мне нужно сделать, чтобы обратиться к этим кнопкам в PlayListFragment класс или как мне импортировать файл макета?

Внешний вид PlaylistFragment

...