将片段手动添加到导航架构组件的后台
Adding fragment manually into the backstack in Navigation Architecture Component
我在导航图中有 4 个片段,名为 A、B、C、D,我从用户那里获取一些数据。
当我处于正常流程时 (A->B->C->D) 并按下后退按钮一切正常(返回堆栈)。
但我有一个案例,其中我有并编辑信息流,假设用户将表单留在片段 D 上,所以当用户再次出现在屏幕上时,我必须在同一屏幕上导航用户,即片段 D。
我是通过 Deep-link.
实现的
现在的问题是在上述情况下,堆栈中除了片段 D 之外没有片段。但是我需要当用户按下后退按钮时它 应该导航到片段 C 到片段 B 到片段A .
意味着我希望其他片段(A、B、C)添加到后台堆栈中。我们可以做同样的事情吗,如果可以,怎么做?
===这里是代码===
my_navigation_graph.xml.
<fragment
android:id="@+id/aFragment"
android:name="in.demo.project.AFragment"
android:label="AFragment"
tools:layout="@layout/fragment_a_layout">
<deepLink
android:id="@+id/deepLink"
android:autoVerify="true"
app:uri="demo://editflow?is_for_edit={is_for_edit}&step={step}" />
<argument
android:name="is_for_edit"
android:defaultValue="false"
app:argType="boolean" />
<argument
android:name="step"
android:defaultValue="2"
app:argType="string" />
<action
android:id="@+id/action_aFragment_to_bFragment"
app:destination="@id/bFragment"/>
<action
android:id="@+id/action_aFragment_to_cFragment"
app:destination="@id/cFragment"/>
<action
android:id="@+id/action_aFragment_to_dFragment"
app:destination="@id/dFragment"/>
<fragment
android:id="@+id/bFragment"
android:name="in.demo.project.BFragment"
android:label="BFragment"
tools:layout="@layout/fragment_b_layout">
<action
android:id="@+id/action_bFragment_to_cFragment"
app:destination="@id/cFragment" />
</fragment>
<fragment
android:id="@+id/cFragment"
android:name="in.demo.project.CFragment"
android:label="CFragment"
tools:layout="@layout/fragment_c_layout">
<action
android:id="@+id/action_cFragment_to_dFragment"
app:destination="@id/dFragment" />
</fragment>
<fragment
android:id="@+id/dFragment"
android:name="in.demo.project.DFragment"
android:label="DFragment"
tools:layout="@layout/fragment_d_layout">
</fragment>
正在浏览。
findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment())
Inside AFragment i am redirecting to other fragment, assuming that
creating deep-link to every fragment is not good practice.
此代码在onCreate()
AFragment
方法中
arguments?.let {
if (AFragmentArgs.fromBundle(it).isForEdit) {
redirectionForEdit(AFragmentArgs.fromBundle(it).step)
}
}
和一个重定向函数
private fun redirectionForEdit(step: String) {
when (step) {
"2" ->
findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment())
"3" ->
findNavController().navigate(AFragmentDirections.actionAFragmentToCFragment())
"4" ->
findNavController().navigate(AFragmentDirections.actionAFragmentToDFragment())
}
}
现在,如果我在步骤中得到 4,它将重定向到 DFragment,因此堆栈将是 A->D,但我也希望 B 和 D 进入堆栈(A->B ->C->D).
这个请参考handling custom back navigation under navigation components
OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
@Override
public void handleOnBackPressed() {
// Handle the back button event
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
我在导航图中有 4 个片段,名为 A、B、C、D,我从用户那里获取一些数据。
当我处于正常流程时 (A->B->C->D) 并按下后退按钮一切正常(返回堆栈)。
但我有一个案例,其中我有并编辑信息流,假设用户将表单留在片段 D 上,所以当用户再次出现在屏幕上时,我必须在同一屏幕上导航用户,即片段 D。 我是通过 Deep-link.
实现的现在的问题是在上述情况下,堆栈中除了片段 D 之外没有片段。但是我需要当用户按下后退按钮时它 应该导航到片段 C 到片段 B 到片段A .
意味着我希望其他片段(A、B、C)添加到后台堆栈中。我们可以做同样的事情吗,如果可以,怎么做?
===这里是代码===
my_navigation_graph.xml.
<fragment
android:id="@+id/aFragment"
android:name="in.demo.project.AFragment"
android:label="AFragment"
tools:layout="@layout/fragment_a_layout">
<deepLink
android:id="@+id/deepLink"
android:autoVerify="true"
app:uri="demo://editflow?is_for_edit={is_for_edit}&step={step}" />
<argument
android:name="is_for_edit"
android:defaultValue="false"
app:argType="boolean" />
<argument
android:name="step"
android:defaultValue="2"
app:argType="string" />
<action
android:id="@+id/action_aFragment_to_bFragment"
app:destination="@id/bFragment"/>
<action
android:id="@+id/action_aFragment_to_cFragment"
app:destination="@id/cFragment"/>
<action
android:id="@+id/action_aFragment_to_dFragment"
app:destination="@id/dFragment"/>
<fragment
android:id="@+id/bFragment"
android:name="in.demo.project.BFragment"
android:label="BFragment"
tools:layout="@layout/fragment_b_layout">
<action
android:id="@+id/action_bFragment_to_cFragment"
app:destination="@id/cFragment" />
</fragment>
<fragment
android:id="@+id/cFragment"
android:name="in.demo.project.CFragment"
android:label="CFragment"
tools:layout="@layout/fragment_c_layout">
<action
android:id="@+id/action_cFragment_to_dFragment"
app:destination="@id/dFragment" />
</fragment>
<fragment
android:id="@+id/dFragment"
android:name="in.demo.project.DFragment"
android:label="DFragment"
tools:layout="@layout/fragment_d_layout">
</fragment>
正在浏览。
findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment())
Inside AFragment i am redirecting to other fragment, assuming that creating deep-link to every fragment is not good practice.
此代码在onCreate()
AFragment
arguments?.let {
if (AFragmentArgs.fromBundle(it).isForEdit) {
redirectionForEdit(AFragmentArgs.fromBundle(it).step)
}
}
和一个重定向函数
private fun redirectionForEdit(step: String) {
when (step) {
"2" ->
findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment())
"3" ->
findNavController().navigate(AFragmentDirections.actionAFragmentToCFragment())
"4" ->
findNavController().navigate(AFragmentDirections.actionAFragmentToDFragment())
}
}
现在,如果我在步骤中得到 4,它将重定向到 DFragment,因此堆栈将是 A->D,但我也希望 B 和 D 进入堆栈(A->B ->C->D).
这个请参考handling custom back navigation under navigation components
OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
@Override
public void handleOnBackPressed() {
// Handle the back button event
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);