Обрабатывать onBackPressed в компоненте навигации Android - PullRequest
0 голосов
/ 20 мая 2019

Я реализовал навигационный ящик с компонентами навигации в 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>

И это мое 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, я хочу завершить приложение, но не могу.

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Если мое понимание верно, вы хотите вернуться к HomeFragment, где бы вы ни находились в процессе навигации.В этом случае вы можете попробовать зарегистрировать OnBackPressedCallback для ваших фрагментов через addOnBackPressedCallback и вызвать popBackStack для перехода к вашему HomeFragment.Попробуйте добавить это к 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;
        });
0 голосов
/ 24 мая 2019

Если вы хотите закрыть приложение, когда нажимаете обратно в HomeFragment , просто указываются эти атрибуты последнего действия, которое приведет вас к этому месту назначения:

  1. app:popUpToInclusive до true
  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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...