Android 更改时更新文本片段

Android 更改时更新文本片段,android,kotlin,android-fragments,Android,Kotlin,Android Fragments,因此,我有一个片段,我需要能够始终更新文本 文本字段包括: 歌 艺术家 在我的MainActivity中,我有一个http请求,它不断ping服务器并获取最新信息 它更新了一个全局类 package com.drn1.drn1 object DataHolder { private var Song = "" fun set_Song(s: String) { Song = s } fun get_Song(): Str

因此,我有一个片段,我需要能够始终更新文本

文本字段包括:

  • 艺术家
在我的MainActivity中,我有一个http请求,它不断ping服务器并获取最新信息

它更新了一个全局类

package com.drn1.drn1

object DataHolder {
    private var Song = ""
    fun set_Song(s: String) {
        Song = s
    }

    fun get_Song(): String {
        return Song
    }

private var Artist = ""
    fun set_Artist(s: String) {
        Song = s
    }

    fun get_Artist(): String {
        return Artist
    }

    private var MDIA = "http://stream.radiomedia.com.au:8003/stream"
    fun set_Media(s: String) {
        MDIA = s
    }

    fun get_Media(): String {
        return MDIA
    }


}

问题是我无法在片段中重新设置文本

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        //val context = inflater.context
        //binding = MplayerBinding.inflate(com.drn1.drn1.R.layout.fragment_mplayer)



        val root: View = inflater.inflate(R.layout.fragment_mplayer, container, false)
        val btn = root.findViewById(R.id.mPlayPP) as ImageButton
        val SG = root.findViewById(R.id.song) as TextView

        SG.setText(Song)
}

想知道正确的方法是什么吗?

onCreateView()
仅在第一次创建活动时运行


代码中不清楚您在哪里更新
数据持有者
,但是无论您在哪里更新,您都需要在活动中调用一个方法以使用最新数据更新文本视图。

正如@Ryan所建议的那样,
onCreateView()
只会被调用一次。因此,song textview需要一个类级别变量(在您的示例中,使用
SG
class级别变量代替局部变量)

然后创建一个方法来更新歌曲文本

fun updateSong(song: String) {
    SG.setText(Song)
}
最后,每当您获得更新的信息时,您必须调用这个片段方法


MainActivity
中,当您获得更新的信息时,您将拥有此片段的一个实例。因此,您可以在该对象上调用此方法

您不应该每次都发出HTTP请求来保存更新的数据,这是对资源的过度消耗。您需要一些面向连接的方法来实现这一点,可能是套接字。@ADM将对此进行研究,但这并不能解决我如何在应用程序中更新textView的问题fragment@RussellHarrower看看如何使用LiveData和repository模式,google官方培训资源很好地涵盖了这一点,您必须将这一行写为“SG.setText(Song)”在http请求的响应中,您全局调用并删除“SG”文本视图。