当前位置: 首页 > 知识库问答 >
问题:

调用在UI上显示值后Kotlin LocalBroadcastManager不工作

韦睿
2023-03-14

我有一个正在开发的android应用程序,我在其中通过截取发出API请求,在发出API调用后,我得到了一堆返回的JSON对象。我现在将这些值保存到默认值中。保存后,我现在尝试将值显示到我的ui元素中,但所有内容都是空的,并且没有显示值。我的代码在下面突出显示

fun loginUser(context: Context, email: String, password: String, completion: (Boolean) -> Unit): Unit {

        val jsonBody = JSONObject()
        jsonBody.put("email", email)
        jsonBody.put("password", password)
        val requestBody = jsonBody.toString()

        val loginRequest = object : JsonObjectRequest(Method.POST, URL_LOGIN, null, Response.Listener {response ->

            try {
                userEmail = response.getString("user")
                authToken = response.getString("token")
                isLoggedIn = true
                completion(true)
            } catch (e: JSONException) {
                Log.d("JSON", "EXC:" + e.localizedMessage)
                completion(false)
            }
        }, Response.ErrorListener { error ->
            Log.d("ERROR", "Could not login user: $error")
            completion(false)

        }) {
            override fun getBodyContentType(): String {
                return "application/json; charset=utf-8"
            }
            override fun getBody(): ByteArray {
                return requestBody.toByteArray()
            }
        }
        Volley.newRequestQueue(context).add(loginRequest)
    }

fun findUserByEmail(context: Context, completion: (Boolean) -> Unit): Unit {
        val finUserByEmailRequest = object : JsonObjectRequest(Method.GET, "$URL_GET_USER$userEmail", null, Response.Listener {response ->
            try {
                UserDataService.name = response.getString("name")
                UserDataService.email = response.getString("email")
                UserDataService.avatarName = response.getString("avatarName")
                UserDataService.avatarColor = response.getString("avatarColor")
                UserDataService.id = response.getString("_id")
                val userDataChanaged = Intent(BROADCAST_USER_DATA_CHANGED)
                LocalBroadcastManager.getInstance(context).sendBroadcast(userDataChanaged)
                completion(true)
            } catch (e: JSONException) {
                Log.d("JSON", "EXC:" + e.localizedMessage)
                completion(false)
            }
        }, Response.ErrorListener { error ->
            Log.d("ERROR", "Could not find user: $error")
            completion(false)

        }) {
            override fun getBodyContentType(): String {
                return "application/json; charset=utf-8"
            }
            override fun getHeaders(): MutableMap<String, String> {
                val headers = HashMap<String, String>()
                headers["Authorization"] = "Bearer $authToken"
                return headers
            }
        }
        Volley.newRequestQueue(context).add(finUserByEmailRequest)
    }

我的主要活动

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)
        val toggle = ActionBarDrawerToggle(
                this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
        drawer_layout.addDrawerListener(toggle)
        toggle.syncState()
   LocalBroadcastManager.getInstance(this).registerReceiver(userDataChangeReceiver, IntentFilter(BROADCAST_USER_DATA_CHANGED))
    }

    private val userDataChangeReceiver = object : BroadcastReceiver() {
        override fun onReceive(contect: Context?, intent: Intent?) {
            if (AuthService.isLoggedIn) {
                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))
                loginBtnNavHeader.text = "Logout"
            }
        }
    }

在其中调用loginUser方法

fun loginLoginBtnClicked(view: View): Unit {

        val email = loginEmailTxt.text.toString()
        val password = loginPasswordTxt.text.toString()

        AuthService.loginUser(this, email, password) {success ->
            if (success) {
                AuthService.findUserByEmail(this) {fsuccess ->
                    if (fsuccess) {
                        finish()
                    }
                }
            }

        }
    }

共有1个答案

吕俊美
2023-03-14

您首先需要获得对导航标题主布局的引用,才能更新导航标题主布局中的文本视图和图像视图。不要直接使用元素的id,而应该使用nav_头引用,然后像这样使用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"



        }

    }
}

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

我在学习Android Kotlin课程时也遇到了这个问题,但在搜索之后,我发现很多人都面临这个问题,他们在不同的平台上提问,但没有给出答案。但在搜索相同的术语“UI元素不更新android”后,在java中找到了一些堆栈溢出的答案:如何更改导航抽屉标题中TextView的文本?

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

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

 类似资料:
  • 标题说明了一切。当我调用时,我不希望再显示“”图标,而是显示向后的导航箭头。 不幸的是,当我调用这个方法时,只显示标题,没有向后箭头和“汉堡包”图标。将再次设置为true后,它再次显示“Hamburger”图标。 我设置了和 编辑:基本上,这里建议的解决方案是:将抽屉图标改回后箭头,但不给我后箭头。 有人知道这个问题的解决方案吗?非常感谢!

  • < code > autocomplete textview 出现了一个奇怪的问题。 我有一个,在键入时显示城市建议。城市列表通过 从远程服务器检索。当我使用软键盘或软键盘上的按钮时,建议工作正常。确实显示建议的城市。 但是,当我尝试使用设置文本时,我有一个问题。.我也尝试过但仍然没有运气。 适配器就在那里,只是建议没有显示出来。 有什么建议吗? 谢了。

  • 问题内容: 我正在编写Rails 4.0.2应用程序,并试图在AJAX事件发生后在我的视图中显示Flash通知。 在我看来,我会显示一个日历,其中包含用户可以点击的天数。当他们这样做时,我会通过onclick事件处理程序触发AJAX事件,该事件处理程序会更新我的模型(添加或删除记录)。触发事件后,我将完成页面刷新以显示更新的结果。 我发现我必须在JS click事件期间进行页面刷新,以使视图正确更

  • 我有一个带有标头的Spring Boot REST控制器,它可以有多个值: 并使用Springfox实现了Swagger。当我加载Swagger UI时,我只能从版本标题列表中看到并选择v1选项。如何在Swagger UI中显示所有表头值以供选择?如何更改Swagger UI列表中的默认头值?

  • 我正在从应用程序中的迁移到。但我不知道如何在

  • 我有一个spring的网络应用程序,我增加了swagger和swagger-UI。我添加了一个虚拟类来测试Swagger: 构建/部署之后,我可以在swagger页面上看到虚拟类(参见附件1)。问题是,“列表操作”没有显示任何内容。原始输出如下: 我想,问题是一个缺失的标签“操作”或类似的东西……但我不确定(也不知道,如何修复这一点)。有什么建议吗?