Android中Navigation的使用

本文详细介绍了Android中使用Navigation组件进行页面导航的方法,包括如何配置页面跳转、在Activity中获取当前Fragment对象以及如何在Fragment中处理onActivityResult回调。

一、页面导航:A–>B–>C

页面从A到B,有B到C,然后由C返回A时的写法

页面B在xml中的配置
<fragment
        android:id="@+id/B"
        android:name="xxx.VerificationPhoneFragment"
        android:label="@string/VerificationPhoneFragment"
        tools:layout="@layout/fragment_verification_phone">
        <action
            android:id="@+id/action_B_to_C"
            app:destination="@id/C"
            app:popUpTo="@id/B"
            app:popUpToInclusive="true"
            />
    </fragment>

二、在Activity中获取当前的Fragment对象

  1. java中
public Fragment getFragment(Class<?> clazz) {
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    if (fragments!= null && fragments.size() > 0) {
       NavHostFragment navHostFragment = (NavHostFragment) fragments.get(0);
       List<Fragment> childfragments = navHostFragment.getChildFragmentManager().getFragments();
       if(childfragments != null && childfragments.size() > 0){
           for (int j = 0; j < childfragments.size(); j++) {
               Fragment fragment = childfragments.get(j);
               if(fragment.getClass().isAssignableFrom(clazz)){
                   Log.i(TAG, "getFragment1: " + fragment);
                   return fragment;
               }
           }
       }
    }
    return null;
}
  1. kotlin中
   private fun <F : Fragment> getFragment(fragmentClass: Class<F>): F? {
        val navHostFragment = this.supportFragmentManager.fragments.first() as NavHostFragment
        navHostFragment.childFragmentManager.fragments.forEach {
            if (fragmentClass.isAssignableFrom(it.javaClass)) {
                return it as F
            }
        }
        return null
    }

三、Fragment中onActivityResult的调用

在这个Fragment所以的Activity的onActivityResult中获取当前的Fragment对象,再调用这个对象的onActivityResult方法。

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        val myPersonInfoFragment:MyPersonInfoFragment= getFragment(MyPersonInfoFragment::class.java)!!
        myPersonInfoFragment.onActivityResult(requestCode, resultCode, data)
    }

如果有多个Fragment都需要调用onActivityResult的方法,则可以在循环中调用。

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        val navHostFragment = this.supportFragmentManager.fragments.first() as NavHostFragment
        val listFragments = navHostFragment.childFragmentManager.fragments
        for(item:Fragment in listFragments){
            if(item is MyPersonInfoFragment){
                item.onActivityResult(requestCode, resultCode, data)
            }else if(item is FeedBackFragment){
                item.onActivityResult(requestCode, resultCode, data)
            }
        }
    }
Android 应用开发中,使用 Navigation Component 可以实现 Fragment 之间的页面导航,简化导航逻辑并提升开发效率。Navigation Component 是 Android Jetpack 的一部分,它通过声明式的方式管理 Fragment 之间的跳转、返回栈以及数据传递[^4]。 ### 使用 Navigation Component 实现 Fragment 导航的基本步骤 1. **添加依赖** 在 `build.gradle` 文件中添加 Navigation 的依赖: ```gradle dependencies { implementation "androidx.navigation:navigation-fragment-ktx:2.7.7" implementation "androidx.navigation:navigation-ui-ktx:2.7.7" } ``` 2. **创建导航图(Navigation Graph)** 在 `res/navigation/` 目录下创建一个 XML 文件作为导航图,例如 `nav_graph.xml`,并在其中定义 Fragment 以及它们之间的导航路径: ```xml <?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" android:id="@+id/nav_graph" app:startDestination="@id/firstFragment"> <fragment android:id="@+id/firstFragment" android:name="com.example.FirstFragment" android:label="FirstFragment"> <action android:id="@+id/action_firstFragment_to_secondFragment" app:destination="@id/secondFragment" /> </fragment> <fragment android:id="@+id/secondFragment" android:name="com.example.SecondFragment" android:label="SecondFragment" /> </navigation> ``` 3. **在 Activity 中设置 NavController** 在主 Activity 中使用 `NavHostFragment` 来承载 Fragment,并通过 `NavController` 来管理导航: ```kotlin val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController findViewById<FragmentContainerView>(R.id.nav_host_fragment).setupWithNavController(navController) ``` 4. **在 Fragment 中触发导航** 在某个 Fragment 中通过 `NavController` 触发导航动作,例如从 `FirstFragment` 导航到 `SecondFragment`: ```kotlin val navController = findNavController() navController.navigate(R.id.action_firstFragment_to_secondFragment) ``` ### 优势与注意事项 - **优势**:Navigation Component 提供了统一的导航逻辑,简化了 Fragment 之间的跳转和返回栈管理,同时支持类型安全的数据传递[^1]。 - **注意事项**:如果使用不当,可能会遇到 `View does not have a NavController set` 等错误,因此需要确保正确设置 `NavController` 并绑定到 Fragment 或 Activity 上[^2]。 ### 示例代码总结 以下是一个完整的导航触发示例: ```kotlin // 在 Fragment 中获取 NavController 并导航 val navController = findNavController() navController.navigate(R.id.action_firstFragment_to_secondFragment) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值