android - 如何使用导航架构组件将日志记录添加到导航返回或向上?
问题描述
我在我的 Android 应用程序中使用导航组件,它会自动为我提供后退和向上导航。现在我不想更改任何这些行为,但我想添加一些特定于用户按下工具栏中的向上按钮或后退按钮的片段的日志记录。
我试过这个,它只适用于后退按钮,我不知道如何保持默认导航行为不变。另外,这似乎在活动级别添加了一个回调,因此它并不特定于我添加回调的片段。
似乎 onOptionsItemSelected 被称为普通菜单项,但不是向上按钮。
如何在不改变整个应用程序的行为的情况下始终如一地处理这个问题?
解决方案
你非常接近答案。
尝试这个。
注意:此代码是从我的应用程序中复制的。根据您的要求进行更改。
在活动中:
在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架构导航组件
如果有任何不清楚的地方,请发表评论。
推荐阅读
- apache-drill - Apache Drill:哈希联接不支持架构更改 额外列上的错误
- bash - if/else 测试 bash 中 case 控制语句的等效项
- r - 如何有效地加载 xlsx 文件
- hadoop - 配置大型 Hive 导入作业
- r - 获取最新记录,但如果最新为空则获取最后一条最新记录
- ruby-on-rails - 在 Rails 应用程序中使用耐嚼的 gem 更新用户索引失败
- encryption - Base64 扩展密钥的加密强度
- javascript - 我的 firebase 保存数据有一些错误
- java - Firebase 在每个循环之后给出空值
- python - Itertool 组合 Python 数据框