Android中Navigation的使用

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、页面导航: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 Jetpack Navigation 组件 #### 设置依赖项 为了能够使用 Navigation 组件,需在项目的 `build.gradle` 文件中添加必要的依赖项。确保已配置最新版本的库[^1]。 ```gradle dependencies { def nav_version = "2.7.0" // 版本号可能有所不同,请查阅官方文档确认最新的稳定版 implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" } ``` #### 创建导航图 (Navigation Graph) 通过 XML 定义应用内的目的地及其之间的路径称为导航图。可以在项目中的 `res/navigation/` 资源文件夹下创建一个新的资源文件来定义此图形结构。 ```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/startFragment"> <fragment android:id="@+id/startFragment" android:name="com.example.StartFragment"> <!-- 动作 --> <action android:id="@+id/action_start_to_next" app:destination="@id/nextFragment"/> </fragment> <fragment android:id="@+id/nextFragment" android:name="com.example.NextFragment"/> </navigation> ``` #### 配置宿主 Activity 和 FragmentContainerView 为了让应用程序支持导航功能,在活动布局中放置一个 `FragmentContainerView` 或者传统的 `FrameLayout` 来作为容器用于显示目标片段,并设置该视图为 NavHost【^1】。 ```xml <layout ... > ... <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" /> ... </layout> ``` #### 导航到其他目的地方向 利用 `findNavController()` 方法可以找到当前上下文中关联的 NavController 实例,进而调用其 `navigate()` 函数实现页面跳转操作[^4]。 ```java // Java 示例代码 Button buttonNext; buttonNext.setOnClickListener(v -> Navigation.findNavController(v).navigate(R.id.nextFragment)); ``` ```kotlin // Kotlin 示例代码 val buttonNext : Button by lazy { findViewById<Button>(R.id.button_next) } buttonNext.setOnClickListener { findNavController(it).navigate(R.id.nextFragment) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值