首页 > 解决方案 > 如何从 Kotlin(Android)中的另一个类调用布局?

问题描述

我目前正在开发一个 Android (Kotlin) 项目。基本上,它是一个音频播放器,可以列出并播放设备上保存的所有音频文件。

播放器由 Kotlin 片段 (PlaylistFragment.kt)、关联的布局文件 (fragment_play_list.xml) 和用于播放各个文件的特殊 Kotlink 类 (PlayMusicService.kt) 组成。有关片段布局 (fragment_play_list) 的光学插图,请查看附件。在右下角,您可以看到一些控制按钮(上一个、播放、停止和下一个)。

直接在相应的 kotlin 类(PlayListFragment)中处理这些按钮绝对没有问题。

整个事情的挑战或问题是,我想在另一个文件中解决这四个按钮 - 在 de PlayMusicService-File 中。此文件位于不同的目录中,并且在任何时候都不会访问布局文件。

您可以在下面看到文件 PlayMusicService.kt。如您所见,播放音频文件和在列表中查找 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 类中的这些按钮,或者如何导入布局文件?

播放列表片段外观

标签: androidandroid-studioandroid-layoutandroid-fragmentskotlin

解决方案


推荐阅读