我用最通俗的大白话给你讲清楚,保证你一听就懂!
app:launchSingleTop="true" = 防止重复打开同一个页面
它的作用就是:当你要跳转到的页面已经在返回栈的最顶部时,不再创建一个新的页面,而是直接复用现有的那个。
核心比喻:电梯顶层
想象一下,你在一栋大楼里:
- 返回栈 = 电梯楼层
- 当前页面 = 电梯当前所在楼层
如果你现在在 5 楼 (返回栈顶部是 5 楼),然后你又按了去 5 楼 的按钮:
- 没有
launchSingleTop:电梯会再开一个新的 5 楼,你现在在两个 5 楼之上。 - 有
launchSingleTop="true":电梯不会动,因为你已经在 5 楼了。
最经典的场景:防止重复点击
假设你有一个按钮,点击后跳转到当前页面(比如刷新页面):
xml
ini
<action
android:id="@+id/action_myFragment_to_myFragment"
app:destination="@id/myFragment"
app:launchSingleTop="true" />
效果:
- 第一次点击:正常跳转到
myFragment。 - 第二次点击:因为
myFragment已经在顶部,不会再创建一个新的,而是直接复用。
这样就避免了返回栈里出现多个相同的页面。
两种使用方式
1. 在 XML 中静态设置(推荐)
xml
ini
<action
android:id="@+id/action_home_to_detail"
app:destination="@id/detailFragment"
app:launchSingleTop="true" />
2. 在代码中动态设置
kotlin
scss
val navOptions = NavOptions.Builder()
.setLaunchSingleTop(true)
.build()
findNavController().navigate(R.id.action_home_to_detail, null, navOptions)
一句话总结
launchSingleTop="true" 就是用来防止重复打开同一个页面的,确保返回栈顶部始终只有一个实例。