【问题标题】:How to return to previous fragment by pressing back?如何通过按返回返回到上一个片段?
【发布时间】:2020-06-08 03:09:21
【问题描述】:

我正在使用导航抽屉导航到许多不同的片段。在少数情况下,一些片段被放置在其他片段之上。但是,当我按下后退按钮将我带到上一个片段时,它会回到主片段。

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

【问题讨论】:

  • 如果你可以处理它,你应该使用导航组件。 developer.android.com/guide/navigation/…
  • 如果你使用addToBackStack(null)一次,它应该像onBackPressed一样简单正确处理
  • @EpicPandaForce 是的,我只有一次。我不确定它是怎么回事。出于某种原因,它只是将我送回主片段而不是地图片段?
  • @MuratÇakır 是的,我正在使用导航。但是我不明白当我从 HomeFragment->MapFragment->ImgMapFragment 去按返回键时,为什么会去 imgMapFragment->HomeFragment,而不是 imgMapFragment->MapFragment?
  • 您的样本中有两次:P

标签: android android-studio android-fragments fragment back-stack


【解决方案1】:

看看getFragmentManager().popBackStack()的方法(有几种可供选择)

http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()

【讨论】:

    【解决方案2】:

    AndroidProButNo 是一个新的贡献者。友善点,看看我们的Code of Conduct

    由于 Navigation 组件固有的复杂性,考虑到您需要了解 Navigation 组件、如何使用它以及它试图从您身上隐藏什么,这个问题实际上比最初看起来要复杂得多,因此如果您已经在使用 Navigation 组件,则不应尝试使用它。

    导航组件在内部使用FragmentNavigator,而FragmentNavigator 是执行与destination 的ID (R.id.destination[...]) 相关联的Action。 NavHostFragment 托管此 Navigator,您可以通过 Navigation 组件的 NavController 使基于 Fragment 的导航工作。

    因此,要“返回”当一个选择使用NavHostFragment时,需要使用导航组件来定义所有片段目标,在所述片段目的地之间移动的操作,然后弹出属于的备份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 组件的 backstack 不一致。

    理论上,如果您正确执行此操作,那么导航组件应该已经正确处理了 onBackPressed,因为我相信他们将自己注册为 OnBackPressedDispatcher,并且不必委托手动结束后退事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多