android - Android 导航组件活动意图标志
问题描述
我已经创建了从片段到活动的导航操作,但我无法清除后台堆栈。当我执行从片段到新活动的导航操作并按下后退按钮时,我会回到上一个活动和上一个片段。我无法使用导航图设置 Intent 标志来清除后台堆栈中的先前活动。
<fragment
android:id="@+id/loginFragment"
android:name="com.myapp.auth.LoginFragment"
android:label="login_fragment"
tools:layout="@layout/login_fragment" >
<action
android:id="@+id/action_loginFragment_to_webActivity"
app:destination="@id/webActivity"
app:popUpTo="@id/loginFragment"
app:popUpToInclusive="true" />
</fragment>
<activity
android:id="@+id/webActivity"
android:name="com.myapp.web.WebActivity"
android:label="activity_web"
tools:layout="@layout/activity_web" >
</activity>
从片段导航到新活动时, PopTo和Inclusive标志对后退按钮没有影响,即使它们可以在图形编辑器中设置。我可以使用后退按钮导航到堆栈中不再需要的上一个活动。
在迁移到导航图之前,我可以使用 Intent 标志指定此行为:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
如何使用导航图实现相同的目标?
解决方案
我不得不破解同样的问题。要解决这个问题,您必须做的第一件事是创建一个操作来导航到 Activity,就像您已经完成的那样。
例如:
<action
android:id="@+id/action_frag_to_myActivity"
app:destination="@id/myActivity"
app:popUpTo="@id/myActivity" />
现在,您可以将参数作为 Intent Extras 传递给 Activity,因此您可以利用它来使目标 Activity 执行“脏工作”并为您清除后台堆栈。
假设您的导航图中有这个活动标签:
<activity
android:id="@+id/myActivity"
android:name="com.dummy.MyActivity"
android:label="activity_my" />
您可以在其中添加一个参数并添加一个默认值。例如:
<activity
android:id="@+id/myActivity"
android:name="com.dummy.MyActivity"
android:label="activity_my">
<argument
android:name="clearBackstack"
app:argType="boolean"
android:defaultValue="true" />
</activity>
然后,一旦你调用findNavController().navigate(R.id.myActivity)
它,它就会传递一个额外的意图,"clearBackstack"
其中包含你可以在 ActivityonCreate()
方法中读取的密钥。类似于下面的示例。
我的活动.kt
private val EXTRA_LOGOUT = "clearBackstack"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (intent.extras?.getBoolean(EXTRA_LOGOUT) == true) {
clearBackstack()
} else {
setContentView(R.layout.activity_my)
}
}
private fun clearBackstack() {
startActivity(Intent(this, MyActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
})
finish()
}
请记住,您可以修改参数并自定义要在目标 Activity 上执行的操作。导航到该值后,您也可以修改该值。您可以在 docs中阅读有关它的更多信息。
推荐阅读
- javascript - while 循环中的 Javascript。这是可接受的做法吗?
- html - 宽度不会从 Div 中删除
- visual-studio-code - 如何在 Visual Studio 代码中在 Windows 上编译 ac++ 项目?
- bash - 解析 CSV 以找到与代码对应的名称,然后将具有匹配代码的文件夹复制到具有相应名称的文件夹
- angular - 在运行时为 AOT 编译的 Angular 应用程序获取 --locale 的值
- r - 从矩阵中采样并在 R 中拆分采样值和非采样值
- r - 将 MongoDB 与 R 结合使用——如何仅将嵌套对象作为数据框进行查询和返回?
- excel - Excel VBA IF 语句被跳过
- postgresql - PostgreSQL 重用计算结果作为其他选择计算的输入
- external-tables - Spectrum 相同的外部表在多个模式中显示 (svv_external_tables)