我正在使用导航抽屉导航到许多不同的片段。在某些情况下,某些片段会放置在其他片段上。但是,当我按下“后退”按钮将我带到上一个片段时,它将带回到原始片段。
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
答案 0 :(得分:0)
AndroidProButNo是新的贡献者。很好,请查看我们的Code of Conduct。
由于Navigation组件固有的复杂性,考虑到您需要了解Navigation组件,如何使用它以及它试图为您解决的内容,这个问题实际上比最初看起来要棘手得多。 ,因此如果您已经在使用导航组件,则不应该尝试使用。
导航组件在内部使用FragmentNavigator
,而FragmentNavigator
是执行与destination
的ID(R.id.destination[...]
)关联的Action的对象。 NavHostFragment
托管了此导航器,供您通过导航组件的NavController
使基于片段的导航工作。
因此,要在选择使用NavHostFragment
时“向后导航”,需要使用Navigation Component定义所有Fragment目的地,在所述Fragment目的地之间移动的动作,然后弹出所属的Backstack到NavController(它将在内部管理FragmentManager)。
看起来像这样
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组件的后堆栈不一致。
从理论上讲,如果您正确执行了此操作,那么onBackPressed
应该已经由Navigation组件正确处理,因为我相信他们将自己注册为OnBackPressedDispatcher
,并且不要必须手动委派back事件。
答案 1 :(得分:-1)
看看getFragmentManager().popBackStack()
方法(有几种方法可供选择)
http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()