我是Android Jetpack导航架构的新手。我正在一个新应用程序上试用它。有一个活动和一些片段,其中两个是登录屏幕和电子邮件登录屏幕。我在我的导航XML中定义了这些片段。应用程序的流程如下:
登录屏幕→ <代码>电子邮件登录屏幕
我想要的是,在导航到电子邮件登录屏幕后,当我向后按时,应用程序退出。这意味着登录屏幕的后堆栈被删除了。我知道登录屏幕不应该这样工作,但我仍然只是在解决问题。
我遵循了谷歌导航组件入门的文档。它说,使用app:popUpTo和app:popuptinclusive=“true”应该可以清除Backbackback,但是当我在电子邮件登录屏幕上按back时,它仍然返回登录而不是退出。
这是我试过的。
nav_main.html" target="_blank">xml
<fragment android:id="@+id/loginFragment"
android:name="com.example.myapp.ui.main.LoginFragment"
android:label="@string/login"
tools:layout="@layout/fragment_login" >
<action
android:id="@+id/action_login_to_emailLoginFragment"
app:destination="@id/emailLoginFragment"
app:popEnterAnim="@anim/slide_in_right"
app:popExitAnim="@anim/slide_out_right"
app:popUpTo="@+id/emailLoginFragment"
app:popUpToInclusive="true"/>
</fragment>
<fragment android:id="@+id/emailLoginFragment"
android:name="com.example.myapp.ui.main.EmailLoginFragment"
android:label="EmailLoginFragment"
tools:layout="@layout/fragment_login_email" />
登录碎片。千吨
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding.emailLoginButton.setOnClickListener {
findNavController().navigate(R.id.action_login_to_emailLoginFragment)
}
return binding.root
}
我为按钮提供了一个单击事件。在其中,我使用导航控制器通过为其提供操作ID来导航到电子邮件登录屏幕。在中
在一遍又一遍地阅读文档,以及阅读大量StackOverflow问题后,我发现这些属性应该将我的登录屏幕从后堆栈中删除。但他们没有。这个按钮确实会导航到电子邮件登录屏幕,但当我按下后退键时,它仍然会返回到登录屏幕,而不是退出应用程序。我错过了什么?
您可以像这个答案一样在XML中完成,也可以通过编程实现:
NavOptions navOptions = new NavOptions.Builder().setPopUpTo(R.id.loginRegister, true).build();
Navigation.findNavController(mBinding.titleLogin).navigate(R.id.login_to_main, null, navOptions);
这2行使技巧奏效:
如果你想从A到B,并希望完成A:
您需要通过以下操作呼叫B:
<fragment
android:id="@+id/fragmentA"
tools:layout="@layout/fragment_a">
<action
android:id="@+id/action_call_B"
app:destination="@+id/fragmentB"
app:popUpTo="@id/fragmentA"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/fragmentB"
tools:layout="@layout/fragment_b">
</fragment>
如果您将日志放在片段中,您可以看到在使用此操作调用片段B后,片段A已被销毁。
<action
android:id="@+id/action_login_to_emailLoginFragment"
app:destination="@id/emailLoginFragment"
app:popEnterAnim="@anim/slide_in_right"
app:popExitAnim="@anim/slide_out_right"
app:popUpTo="@+id/loginFragment"
app:popUpToInclusive="true"/>
您的popUpTo将返回到电子邮件登录,然后由于包含而弹出它。如果您将popUpTo更改为您的登录片段,它将被导航回,并由于包含标志而弹出,这将导致您想要的行为。
根据文件。 我正在使用的库版本:
问题内容: 我有4页。 从第1页>第2页>第3页>第4页。 用户到达page_3并单击按钮后,它将导航到page_4。单击该按钮后,我想清除所有导航历史记录,以便当用户返回page_4时,该应用程序退出而不是返回至page_3。 我试过了: 但是什么也没发生。我仍然可以返回page_3,page_2等。如何做到这一点,以便当用户单击page_3上的按钮时,他可以转到page_4,而从page_4不
我正在使用Android中新的导航架构组件。我有三个片断,逻辑片断,主片断,解决片断。主机片段是LoginFragment,登录成功时转到MainFragment,在MainFragment中转到SettingFragment,注销转到LoginFragment。
我已经从连接到NavController的导航抽屉中导航到了DialogFragment。但当我导航到另一个目标时,我已经将弹出窗口设置为包含对话框片段,但它并没有清除堆栈。如何清除堆栈? AM从LogoutDialog调用此方法 我只使用片段和一个活动。 这是我导航图的一部分
我有一个包含FragmentStatePagerAdapter的活动在这个FragmentStatePagerAdapter中有三个片段。或者,当调用适当的getItem()时,它们会被启动。 该活动执行数据密集型任务,完成后发送广播。我已经在FragmentStatePagerAdapter中的每个片段中注册了一个广播接收器。 现在这一切都很好,除了一件事: 当我们滚动到位置2处的片段(位置1和
我正在使用android中的新导航架构组件,在移动到一个新的片段后,我被困在清除导航堆栈中。 示例:我在loginFragment中,当我导航到home片段时,我希望该片段从堆栈中清除,这样当用户按下back按钮时,他就不会返回到loginFragment。 我正在使用一个简单的navhostfragment.findnavcontroller(Fragment).navigate(r.id.ho