kotlin - 本地广播不更新 UI

标签 kotlin broadcastreceiver localbroadcastmanager

我的注册用户事件中有此代码:

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))

和 userDatachangeReceiver 函数:
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"
        }
    }
}

创建用户事件更新 userDataService 就好了,当我记录它时,我得到了正确的参数。
AuthService.isLoggedIn 返回 true 但抽屉 UI 未更新
我试图把它放在 onStart 中,onResume 在 onPause 上取消注册但没有运气,当我尝试访问意图内的包时,我得到空值。
我把它放在那里只是为了看看它是否真的通过了
有任何想法吗?

最佳答案

您首先需要获取对 nav_header_main 布局的引用,以便能够更新 nav_header_main 中的 text-View 和 image-view。而不是直接使用元素的 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 类(class)时也偶然发现了这个问题,但经过搜索,我发现很多人都面临着这个问题,他们在不同的平台上提出了问题,但没有提供答案。但是在搜索相同的术语“UI 元素不更新 android”之后,在 java 中发现了一些堆栈溢出答案如何更改抽屉导航标题中 TextView 的文本?

他们都解释说首先获得引用,然后我们才能更新 View 。然后我尝试了,幸运的是它工作得很好。

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

关于kotlin - 本地广播不更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48060226/

相关文章:

android - BroadcastReceiver 和 AlarmManager 不兼容

android - Android LocalBroadcast导致应用崩溃

java - 正则表达式引擎在没有另一次传递的情况下无法匹配所有出现的情况

java - Rxjava2 blockingSubscribe 与订阅

android - 我将为此 StoreBuilder 使用什么样的 key

android - 动态注册 BroadcastReceiver - 接收器未注册

java - BroadcastReceiver 中的 EditText

android - LocalBroadcastManager 未按预期工作

android - 无法解析声明 android.support.v4.content.LocalBroadcastManager 上的 import LocalBroadcastManager;

kotlin - 如何在kotlin中使用volley库获取信息