首页 > 解决方案 > 如何使用导航架构组件将日志记录添加到导航返回或向上?

问题描述

我在我的 Android 应用程序中使用导航组件,它会自动为我提供后退和向上导航。现在我不想更改任何这些行为,但我想添加一些特定于用户按下工具栏中的向上按钮或后退按钮的片段的日志记录。

我试过这个,它只适用于后退按钮,我不知道如何保持默认导航行为不变。另外,这似乎在活动级别添加了一个回调,因此它并不特定于我添加回调的片段。

似乎 onOptionsItemSelected 被称为普通菜单项,但不是向上按钮。

如何在不改变整个应用程序的行为的情况下始终如一地处理这个问题?

标签: androidkotlinnavigation

解决方案


你非常接近答案。
尝试这个。

注意:此代码是从我的应用程序中复制的。根据您的要求进行更改。

在活动中:

onCreate()

// Observe action state live data
activityViewModel.actionStateMutableLiveData.observe(this, Observer { actionState ->
    actionState?.let {
        if (actionState != "NO_ACTION") {
            when (actionState) {
                "NAVIGATE_UP" -> {
                    if (!navController.navigateUp()) {
                        finish()
                    }
                }
            }
            // Reset action state
            activityViewModel.setActionState("NO_ACTION")
        }
    }
})

和,

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        android.R.id.home -> {
            navController.currentDestination?.id?.let { currentDestinationId ->
                return when (currentDestinationId) {
                    R.id.fragmentToLog -> {
                        false
                    }
                    else -> {
                        activityViewModel.setActionState("NAVIGATE_UP")
                        true
                    }
                }
            }
            activityViewModel.setActionState("NAVIGATE_UP")
            return true
        }
        else -> {
                item.onNavDestinationSelected(findNavController(R.id.fragment_activitymain))
                        || super.onOptionsItemSelected(item)
        }
    }
}

分段:

onViewCreated()

requireActivity().onBackPressedDispatcher.addCallback(this) {
    handleNavigateBack()
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        android.R.id.home -> {
            handleNavigateBack()
            return true
        }
    }
    return super.onOptionsItemSelected(item)
}

private fun handleNavigateBack() {
    // TODO: Add your fragment logs here
    activityViewModel.setActionState("NAVIGATE_UP")
}

活动视图模型:

// Action state
var actionStateMutableLiveData = MutableLiveData(NO_ACTION)
    private set

fun setActionState(actionStateValue: String?) =
    actionStateMutableLiveData.postValue(actionStateValue)

使用的概念:

  • MVVM 架构
  • 实时数据和视图模型
  • Android架构导航组件

如果有任何不清楚的地方,请发表评论。


推荐阅读