android - 如何通过按返回返回到上一个片段?
问题描述
我正在使用导航抽屉导航到许多不同的片段。在少数情况下,一些片段被放置在其他片段之上。但是,当我按下后退按钮将我带到上一个片段时,它会回到主片段。
MapFragment.java
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction fr = getFragmentManager().beginTransaction();
fr.replace(R.id.navHostFragment, new ImgMapFragment()).addToBackStack(null);
fr.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fr.addToBackStack(null);
fr.commit();
如何做到这一点,以便当我打开ImgMapFragment时,我可以返回到我所在的上一个片段而不是HomeFragment
解决方案
AndroidProButNo 是一个新的贡献者。友善点,看看我们的行为准则。
由于 Navigation 组件固有的复杂性,考虑到您需要了解 Navigation 组件、如何使用它以及它试图从您身上隐藏的内容,这个问题实际上比最初看起来要复杂得多。如果您已经在使用 Navigation 组件,那么您不应该尝试使用什么。
导航组件在内部使用FragmentNavigator
, 并执行与的 ID ( )FragmentNavigator
关联的 Action 。托管此导航器,让您通过导航组件的.destination
R.id.destination[...]
NavHostFragment
NavController
因此,要在选择使用时“导航回来” NavHostFragment
,需要使用 Navigation Component 定义所有 Fragment 目的地,在所述 Fragment 目的地之间移动的操作,然后弹出属于 NavController 的 Backstack(它将在内部管理片段管理器)。
它看起来像这样
一个main_activity.xml
布局
<FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
</FrameLayout>
和navigation.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph"
app:startDestination="@id/blankFragment">
<fragment
android:id="@+id/firstFragment"
android:name="com.example.navigationexample.FirstFragment"
android:label="First Fragment"
tools:layout="@layout/first_fragment" >
<action
android:id="@+id/action_first_to_second"
app:destination="@id/secondFragment" />
</fragment>
<fragment
android:id="@+id/secondFragment"
android:name="com.example.navigationexample.SecondFragment"
android:label="Second Fragment"
tools:layout="@layout/second_fragment" />
</navigation>
然后从一个屏幕导航到另一个屏幕,你需要做
try {
Navigation.findNavController(view).navigate(R.id.action_first_to_second);
} catch(Exception e) {}
要返回,你必须做
try {
Navigation.findNavController(view).popBackstack();
} catch(Exception e) {}
由于您在本例中使用 Navigation 组件,因此不应手动管理 FragmentTransactions,因为它会使 Navigation 组件的 backstack 不一致。
从理论上讲,如果您正确执行了此操作,那么onBackPressed
Navigation 组件应该已经正确处理了,因为我相信它们将自己注册为OnBackPressedDispatcher
,并且不必手动委派 back 事件。
推荐阅读
- css - 使用 Emotion css 将图像添加到按钮
- javascript - 我不明白为什么气球在我制作的小游戏中没有移动
- javascript - 简单的javascript函数返回一个未定义的字符串
- c++ - std::bind 是否实现了 std::ref 和 std::cref 以消除函数调用的歧义?
- python - AZure DataBricks - 大型 CSV 文件字段验证
- javascript - 使用 DataTables ajax 响应中的变量来填充 yadcf 过滤器
- c# - 使用 AsyncContext 遇到死锁代码
- php - 使用 php 或其他语言使部分 url 消失
- python - 如何为多项逻辑回归构建此数据集
- mysql - 了解为什么在开头和结尾使用元音查询城市不起作用