本地广播未更新 UI



我的注册用户活动中有以下代码:

val userDataChange = Intent(BROADCAST_USER_DATA_CHANGE)
userDataChange.putExtra("aaa", "aaaaaaaa")
userDataChange.putExtra("bbb", 123)
LocalBroadcastManager.getInstance(this).sendBroadcast(userDataChange)

在主要活动中,接收者:

LocalBroadcastManager.getInstance(this)
.registerReceiver(userDataChangeReceiver, 
IntentFilter(BROADCAST_USER_DATA_CHANGE))

和用户数据更改接收器函数:

private val userDataChangeReceiver = object: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Log.d("aaa", AuthService.isLoggedIn.toString())
userNameNavHeader.text = "BBBBBBBBBBB"
if (AuthService.isLoggedIn == true) {
userNameNavHeader.text = userDataService.name
userEmailNavHeader.text = userDataService.email
val resourceId = resources.getIdentifier(userDataService.avatarName, "drawable",
packageName)
userImageNavHeader.setImageResource(resourceId)
userImageNavHeader.setBackgroundColor(userDataService.returnAvatarColor(userDataService.avatarColor))
loginButtonNavHeader.text = "Logout"
}
}
}

创建用户活动可以很好地更新用户数据服务,当我记录它时,我会得到正确的参数。 AuthService.isLoggedIn 返回 true,但抽屉 UI 未更新 我试图把它放在onStart中,onResume在onPause上取消注册,但没有运气,当我尝试访问意图中的捆绑包时,我得到空。 我把它放在那里只是为了看看它是否真的变得粗壮 有什么想法吗?

首先需要获取对nav_header_main布局的引用,以便能够更新nav_header_main中的文本视图和图像视图。与其直接使用元素的 id,不如使用nav_header引用然后像这样使用 id

private val userDataChangeReceiver = object: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if(AuthService.isLoggedIn){
Log.d("qwe", UserDataService.name)
Log.d("qwe", UserDataService.email)
Log.d("qwe", UserDataService.avatarName)
Log.d("qwe", "Made it inside the broadcast bro")
Log.d("qwe", "Wrap")

nav_drawer_header_include.userEmailNavHeader.text = UserDataService.email
nav_drawer_header_include.userNameNavHeader.text = UserDataService.name
userEmailNavHeader.text = UserDataService.email
val resourseid= resources.getIdentifier(UserDataService.avatarName,"drawable",packageName)
nav_drawer_header_include.userImageNavHeader.setImageResource(resourseid)
nav_drawer_header_include.loginBtnNavHeader.text="Logout"

}
}

}

我们应该最常使用Log,它帮助我直接解决问题,而不是将时间浪费在完美的工作上。

我在做 Android Kotlin 课程时也偶然发现了这个问题,但搜索后我发现很多人都面临着这个问题,他们在不同的平台上提出问题,但没有提供答案。但是在搜索相同的术语"UI 元素不更新 android"后,在 java 中发现了一些堆栈溢出答案 如何在导航抽屉标题中更改文本视图的文本?

他们都解释了首先获得参考,然后我们才能更新视图。然后我尝试了,幸运的是它工作得很好。

PS:这是我的第一个答案请不要介意错误,我道歉。

我们无法看到您的整个代码,但也许您不在 UI 线程上?

您只能从主线程更新 UI,您可以使用日志或调试来查看要在哪个线程上测试该理论,或者只是将代码包装在 runOnUiThread 中(这将需要活动上下文)

另外,如果你想挖掘,这里有一个有趣的阅读: 了解 Activity.runOnUiThread

最新更新