本地广播不更新UI

时间:2018-01-02 11:34:06

标签: 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"
        }
    }
}

create user activity更新userDataService就好了,当我记录它时,我得到了正确的参数。 AuthService.isLoggedIn返回true但抽屉UI未更新 我已经尝试将它放在onStart中,onResume取消注册onPause但没有运气,当我尝试访问意图内的包时我得到null。 我把它放在那里只是为了看它是否真的得到了thrugh 任何想法?

2 个答案:

答案 0 :(得分:1)

首先您需要首先获取对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课程时,我也偶然发现了这个问题,但是经过搜索,我发现很多人都遇到了这个问题,他们在不同的平台上提出了问题,但没有提供答案。但是在搜索了相同的术语“ UI元素未更新android”之后,在Java中发现了一些堆栈溢出答案。如何在导航抽屉标题中更改TextView的文本?

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

PS:这是我的第一个回答,对不起,我深表歉意。

答案 1 :(得分:0)

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

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

另外,如果您想挖掘,这里有一个有趣的读物: Understanding Activity.runOnUiThread