我已经创建了一个从片段到活动的导航操作,但是我没有办法清除后堆栈。当我执行从片段到新活动的导航操作时,我按下后退按钮,我被带回上一个活动和上一个片段。我没有办法使用导航图设置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);
如何使用导航图实现相同的功能?
参考法提赫的回答
val extras = ActivityNavigator.Extras.Builder()
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.build()
findNavController().navigate(BlaBlaActivityDirections.actionFooBarToBlaBlaActivity(), extras)
注意,您需要将这些标志添加到活动堆栈中:
我不得不设法解决同样的问题。要解决这个问题,您必须做的第一件事就是创建一个操作来导航到“活动”,就像您已经做过的那样。
例如:
<action
android:id="@+id/action_frag_to_myActivity"
app:destination="@id/myActivity"
app:popUpTo="@id/myActivity" />
现在,您可以将参数作为intent extra传递给“活动”,这样您就可以利用这一点让目标“活动”做“脏活”,并为您清除后台堆栈。
假设您的导航图中有这样一个活动标签:
<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”
的intent extra,您可以在ActivityonCreate()
method中读取该键。类似下面的例子。
我的活动.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()
}
请记住,您可以修改参数并定制您想要在目标活动上做的事情。导航到该值后,您也可以对其进行修改。你可以在文档中了解更多。
您可以从导航定义中的action元素控制singleTop等属性。
导航编辑器中也提供了这些属性。