【问题标题】:setOnMenuItemClickListener executes only oncesetOnMenuItemClickListener 只执行一次
【发布时间】:2021-10-16 04:11:48
【问题描述】:
  invite.setOnMenuItemClickListener {
        drawerLayout.closeDrawer(GravityCompat.START)
        mainViewModel.executeInvite(
            InviteBody(
                Constants.apiKey,
                Constants.apiPass,
                Constants.apiInviteService
            )
        )
        true
    }

由于调用了函数ma​​inViewModel.executeInvite,监听器只执行一次。

executeInvite 是下面使用协程的函数:

fun executeInvite(inviteBody: InviteBody) {
    viewModelScope.launch {

如果我删除这段代码,一切都会完美运行。

邀请是侧边菜单中的一项,点击后会从后端生成动态链接。

【问题讨论】:

  • 尝试使用听者返回的结果(你在这里返回“true”)。我不太明白它是如何工作的,但它会影响行为。
  • 试过 false 也没用
  • 也许你在使用 Moxy 并且它与它的命令策略有关?
  • @kirkadev 我正在使用 MVVM,但事实并非如此。通过执行 DialogFragment 解决了这个问题谢谢

标签: android kotlin onclick navigationview


【解决方案1】:

如果我删除这段代码,一切都会完美运行。

所以你告诉我,如果你放

invite.setOnMenuItemClickListener {
    drawerLayout.closeDrawer(GravityCompat.START)
    Log.d("asdf", "hello")
    true
}

executeInvite,然后按3次邀请菜单项,你会看到3个日志语句说“你好”?如果是这样,那么您的侦听器应该是正确的,并且错误发生在 executeInvite 正在执行的代码中的某处。

如果是这种情况,您可以通过以下方式进行调试:

fun executeInvite(inviteBody: InviteBody) {
    viewModelScope.launch {
        runCatching { /* whatever code you're doing */ }
            .onSuccess { Log.d("asdf", "successful!") }
            .onFailure { throwable -> Log.d("asdf", "failure!", throwable) }
    }
}

【讨论】:

  • 第一点是对的,但是我在第二部分没有收到任何错误,我已经用try catch包围了它
  • runCatching 是您对协程执行 try/catch 的方式。尝试并确认它是成功的。如果第一点是正确的(关于日志),那么我们知道监听器工作并且问题在 executeInvite 内的某个地方(或者至少问题是 executeInviteresult 并且是打断听众)
  • 我已经做到了。太感谢了。我发布了一个答案。问题是我尝试了不同的 API,我什至尝试从协程范围内调用它。这是导致它的异常:/ViewRootImpl: sendUserActionEvent()。无论如何,通过执行 DialogFragment 并在那里执行 API 来解决它。谢谢
  • 还有一件事忘了说,即使我在没有 API 调用的情况下调用 vm 来发布一个值,也会导致侦听器冻结。
【解决方案2】:

所以对于每个遭受这种痛苦的人

我设法通过创建 DialogFragment 并从菜单单击侦听器调用它来解决此问题。代码如下:

 invite.setOnMenuItemClickListener {
        drawerLayout.closeDrawer(GravityCompat.START)
        InviteDialogFragment().show(
            supportFragmentManager, Constants.apiInviteService)
        true
    }

在 Invite Fragment 中有另一个视图模型,它将调用 API 并在那里观察结果。出于某种原因,从 onMenuCLickListener 调用 API 会导致视图级别的异常,从而使导航项的所有其他项都无法点击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2017-04-10
    相关资源
    最近更新 更多