【问题标题】:Handle onBackPressed in Android Navigation Component在 Android 导航组件中处理 onBackPressed
【发布时间】:2019-05-20 08:50:04
【问题描述】:

我已经在 Android 中实现了带有导航组件的导航抽屉。当我点击后按时,我有 5 个片段要返回到我的HomeFragment。目前他们停留在BackStack 上,不去我想要的片段,而是去第一个片段。 这是我的nav_graph

<?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"
            xmlns:tools="http://schemas.android.com/tools"
            app:startDestination="@id/setupFragment"
            android:id="@+id/treasure_nav"
            android:label="Pick a country">
    <fragment android:id="@+id/homeFragment"
              android:name="com.stavro_xhardha.pockettreasure.ui.home.HomeFragment"
              android:label="Home"
              tools:layout="@layout/fragment_home">
        <action android:id="@+id/action_home_fragment_to_namesFragment2"
                app:popUpTo="@id/homeFragment"
                app:destination="@id/namesFragment"/>
        <action android:id="@+id/action_home_fragment_to_quranFragment"
                app:popUpTo="@id/homeFragment"
                app:destination="@id/quranFragment"/>
        <action android:id="@+id/action_homeFragment_to_tasbeehFragment"
                app:popUpTo="@id/homeFragment"
                app:destination="@id/tasbeehFragment"/>
        <action android:id="@+id/action_homeFragment_to_galleryFragment"
                app:popUpTo="@id/homeFragment"
                app:destination="@id/galleryFragment"/>
        <action android:id="@+id/action_homeFragment_to_newsFragment"
                app:popUpTo="@id/homeFragment"
                app:destination="@id/newsFragment"/>
        <action android:id="@+id/action_homeFragment_to_settingsFragment"
                app:popUpTo="@id/homeFragment"
                app:destination="@id/settingsFragment"/>
    </fragment>
    <fragment
            android:id="@+id/namesFragment"
            android:name="com.stavro_xhardha.pockettreasure.ui.names.NamesFragment"
            android:label="Names of Allah"
            tools:layout="@layout/fragment_names"/>
    <fragment
            android:id="@+id/quranFragment"
            android:name="com.stavro_xhardha.pockettreasure.ui.quran.QuranFragment"
            android:label="Quran"
            tools:layout="@layout/fragment_quran"/>
    <fragment android:id="@+id/tasbeehFragment"
              android:name="com.stavro_xhardha.pockettreasure.ui.tasbeeh.TasbeehFragment"
              android:label="Tasbeeh"
              tools:layout="@layout/fragment_tasbeeh"/>
    <fragment android:id="@+id/galleryFragment"
              android:name="com.stavro_xhardha.pockettreasure.ui.gallery.GalleryFragment"
              android:label="Gallery"
              tools:layout="@layout/fragment_gallery"/>
    <fragment android:id="@+id/newsFragment"
              android:name="com.stavro_xhardha.pockettreasure.ui.news.NewsFragment"
              android:label="News"
              tools:layout="@layout/fragment_news"/>
    <fragment android:id="@+id/settingsFragment"
              android:name="com.stavro_xhardha.pockettreasure.ui.settings.SettingsFragment"
              android:label="Settings"
              tools:layout="@layout/fragment_settings"/>
    <fragment android:id="@+id/setupFragment"
              android:name="com.stavro_xhardha.pockettreasure.ui.setup.SetupFragment"
              android:label="Pick country"
              tools:layout="@layout/fragment_setup">
        <action android:id="@+id/action_setupFragment_to_homeFragment3"
                app:destination="@+id/homeFragment"
                app:launchSingleTop="true"
                app:popUpTo="@+id/treasure_nav"
                app:popUpToInclusive="true"/>
    </fragment>
</navigation>

这是我在 MainActivity 中的onBackPressed(也是唯一一个):

override fun onBackPressed() {
        if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
            drawer_layout.closeDrawer(GravityCompat.START)
        } else {
                super.onBackPressed()
        }
    }

编辑:当我删除 super.onBackPressed() 并将其替换为: findNavController(R.id.nav_host_fragment).popBackStack(R.id.homeFragment, false)我实现了我想要的。唯一的问题是,当我在homeFragment 中时,我想结束应用程序但我不能。

【问题讨论】:

  • 无法从您的陈述中理解问题所在。你能详细说明你想在 backPress 上做什么吗?我从你的陈述中总结出两种情况。一个如果您从导航中选择了任何项目,那么在您想要进入主屏幕的背景下。并再次在后台想要退出应用程序。其次,在您想要将片段更改为主页并立即退出时。
  • 首先,当你在互相替换片段时,你必须使用替换片段而不是添加片段,这样它们就不会留在 backStack 中
  • 你在哪里看到replaceadd方法o.O

标签: android android-fragments navigation-drawer android-architecture-navigation


【解决方案1】:

如果我的理解是正确的,那么无论您在导航流程中的哪个位置,您都希望返回 HomeFragment。对于这种情况,您可以尝试通过 addOnBackPressedCallback 在 Fragments 上注册 OnBackPressedCallback,然后调用 popBackStack 导航到 HomeFragment。尝试将此添加到 Fragments 的 onViewCreated 中,需要在后台返回 HomeFragment:

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        navController = Navigation.findNavController(view);

        requireActivity().addOnBackPressedCallback(getViewLifecycleOwner(), () -> {
               navController.popBackStack(R.id.homeFragment, false);
            });
            return true;
        });

【讨论】:

  • 您确实解决了我的问题,尽管看起来我的 API 较低,我将稍微更新一下答案
【解决方案2】:

如果您想在 HomeFragment 中按回时关闭应用程序,只需指定将您导航到此目的地的最后一个操作的这些属性:

  1. app:popUpToInclusivetrue
  2. app:popUpTo 指向您在此处导航的最后一个片段(SetupFragment)(HomeFragment

这意味着像这样更改您的代码:

<fragment android:id="@+id/setupFragment"
          android:name="com.stavro_xhardha.pockettreasure.ui.setup.SetupFragment"
          android:label="Pick country"
          tools:layout="@layout/fragment_setup">
    <action android:id="@+id/action_setupFragment_to_homeFragment3"
            app:destination="@+id/homeFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/setupFragment"          // this line changes
            app:popUpToInclusive="true" />            // and this requires too
</fragment>

【讨论】:

  • 不,我已经同意了。我需要的是,当我从 HomeFragment 转到片段库,而不是片段设置,然后按返回时,它会将我发送到设置片段。我不想要这个,我想回到 HomeFragment
  • 您在设置中,按回后它会将您发送到设置?哇!
  • 你好,我真的很抱歉。这是一个错误:为了说明问题:从Home -> GalleryFragment -> SettingsFragment 导航时。在SettingsFragment 上,当我回击时,它会将我发送到GalleryFragment。我想去HomeFragment
  • 这也不起作用:(
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
相关资源
最近更新 更多