【问题标题】:Android Navigation Component close app from homefragmentAndroid导航组件从homefragment关闭应用程序
【发布时间】:2023-03-12 09:20:02
【问题描述】:

当来到 HomeFragment(startDestination) 时如何清除所有堆栈,当用户通过导航组件按下 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>

【问题讨论】:

    标签: android kotlin navigation android-jetpack onbackpressed


    【解决方案1】:
     @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);
    }
    

    【讨论】:

      【解决方案2】:

      你可以这样做

      //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"
      

      【讨论】:

      • 不工作的应用程序在任何片段的后按时关闭
      • 你在使用2.1.0-alpha06吗?
      • 使用 2.1.0-beta01
      • 您是否将所有者设置为this@HomeFragment 而不是Activity
      【解决方案3】:

      我找到了一种方法,但这不是一种方便的方法,但它对我有用。

      使用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 库?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2020-03-23
      相关资源
      最近更新 更多