Android导航组件如何在主页片段中关闭应用程序

4
当回到HomeFragment(即起始目的地)时,如何清除所有堆栈,通过Navigation组件使用户在HomeFragment上按下返回键时关闭应用。
 <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/homeFragment">


        <fragment android:id="@+id/homeFragment"
                  android:name="ui.fragment.home.HomeFragment"
                  tools:layout="@layout/fragmet_home"
                  android:label="HomeFragment" 
                  app:launchSingleTop="true" 
                  app:popUpToInclusive="true">

            <action android:id="@+id/action_homeFragment_to_notificationFragment"
                    app:destination="@id/notificationFragment"
                    app:popUpTo="@+id/homeFragment"
                    app:enterAnim="@anim/pop_enter"
                    app:exitAnim="@anim/pop_exit"
                    app:popEnterAnim="@anim/right_in"
                    app:popExitAnim="@anim/right_out"/>
       </Fragment>

       <fragment  android:id="@+id/notificationFragment"
                  android:name="ui.fragment.notification.NotificationFragment"
                  tools:layout="@layout/fragment_notification"/>
 </navigation>
3个回答

4
 @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    OnBackPressedCallback callback = new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            getActivity().finishAndRemoveTask();
        }
    };
    requireActivity().getOnBackPressedDispatcher().addCallback(this,callback);
}

1
你可以做类似这样的事情:

//backpress only for this fragment
requireActivity().onBackPressedDispatcher.addCallback(this@HomeFragment) {
    // handle back event
    activity?.finishAndRemoveTask()
}

我正在使用。
nav_version_ktx = "2.1.0-alpha06"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version_ktx"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version_ktx"

应用程序不工作,按下任何片段的返回键即关闭。 - Jai Khambhayta
你使用的是 2.1.0-alpha06 吗? - solaza
使用2.1.0-beta01版本 - Jai Khambhayta
你是否将所有者设置为 this@HomeFragment 而不是 Activity - solaza

0

我找到了一种方法,但它不是很方便,但对我有效。

使用2.1.0-alpha02

nav_version_ktx = "2.1.0-alpha02"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version_ktx"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version_ktx"

并且在导航上

var navHostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment)
       bottom_home.setOnNavigationItemSelectedListener(BottomNavigationView.OnNavigationItemSelectedListener { menuItem ->
            when (menuItem.itemId) {
                R.id.navigation_home -> {
                        val backStackEntryCount = navHostFragment?.childFragmentManager?.fragments?.size
                        for (i in -1 until backStackEntryCount as Int) {
                            findNavController(R.id.my_nav_host_fragment).popBackStack()
                        }
                        findNavController(R.id.my_nav_host_fragment).popBackStack()

                        findNavController(R.id.my_nav_host_fragment).navigate(R.id.homeFragment)
                        }
                    return@OnNavigationItemSelectedListener true
                   }
               R.id.navigation_notifications -> {
                        findNavController(R.id.my_nav_host_fragment).navigate(R.id.notificationFragment)
                        return@OnNavigationItemSelectedListener true
                }
           false
        })

你为什么要使用 findFragmentById 而不是 Jetpack Navigation 库呢? - IgorGanapolsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接