Local Broadcast не обновляет интерфейс
У меня есть этот код в моем реестре активности пользователя:
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, но пользовательский интерфейс ящика не обновляется. Я попытался поместить его в onStart, отменить регистрацию onRause на onPause, но не повезло, также когда я пытаюсь получить доступ к пакету внутри намерения, которое я получаю нулевым. я положил его туда, чтобы посмотреть, получится ли у него какие-нибудь идеи?
1 ответ
Сначала вам нужно получить ссылку на макет nav_header_main, чтобы иметь возможность обновлять текстовое представление и представление изображения в nav_header_main. Вместо непосредственного использования идентификатора элементов, вы должны использовать ссылку nav_header, а затем идентификатор, подобный этому
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, но после поиска обнаружил, что с этим сталкиваются многие люди, которые задавали вопрос на разных платформах, но ответа не было. Но после поиска тех же терминов "элементы пользовательского интерфейса не обновляют Android" нашел некоторые ответы переполнения стека в Java Как изменить текст TextView в заголовке ящика навигации?
Все они объяснили, чтобы сначала получить ссылку, а затем мы сможем обновить вид. Тогда я попытался, и, к счастью, все заработало отлично.
PS: Это мой первый ответ, пожалуйста, не обращайте внимания на ошибки, я прошу прощения.
Мы не можем увидеть весь ваш код, но, может быть, вы не в UI-Thread?
вы можете обновить пользовательский интерфейс только из основного потока, вы можете использовать логи или отладку, чтобы увидеть, в каком потоке вы хотите проверить эту теорию, или просто обернуть свой код в runOnUiThread (который потребует контекста активности)
кроме того, вот интересное прочтение, если вы хотите копать: Понимание Activity.runOnUiThread