webdevqa.jp.net

Android Navigation ComponentでonBackPressedを処理する

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にいるときにアプリを終了したいのですが、できないということです。

3

HomeFragmentを押してアプリを閉じる場合は、この宛先に移動する最後のアクションの属性が指定されているだけです。

  1. app:popUpToInclusiveからtrue
  2. app:popUpTo最後のフラグメントのto(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>
0
beigirad