Android下使用Navigation和FragmentContainerView实现Fragment的加载和传值

Android下使用Navigation和FragmentContainerView实现Fragment的加载和传值,第1张

之前一直使用FragmentManager进行Fragment管理,最近发现Android官方早就出了更好用的组件,那么我就在此记录一下,既能方便他人上手,也能巩固自己的记忆。

此处主要实现在Acitivty下加载Fragment以及Activity对Fragment进行传值,Fragment之间的切换以及传值。

因为时间有限,文章的内容没有细写,主要还是为了备忘,后期有时间可以考虑认真写一期,包括多种加载方式等等,还请看官见谅。

一、添加Gradle依赖

在App目录下添加navigation依赖

dependencies {
    implementation "androidx.navigation:navigation-fragment-ktx:2.4.2"
    implementation "androidx.navigation:navigation-ui-ktx:2.4.2"
}
二、相应文件代码 1.FragmentIndexActivity下的代码

Kotlin代码:

class FragmentIndexActivity : AppCompatActivity(R.layout.activity_fragment_index) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 传递的bundle
        val testBundle = Bundle()
        testBundle.putString("text", "传递值:点击跳转页面")
        // 获取NavHostFragment实例
        val navHost = supportFragmentManager.findFragmentById(
            R.id.container_view
        ) as NavHostFragment
        // 通过NavHostFragment获取NavController实例
        val controller = navHost.navController
        // 通过NavController获取NavGraph实例
        val graph = controller.graph
        // 新建一个NavFragment对应的传递参数Argument
        val builder = NavArgumentBuilder()
        builder.defaultValue = testBundle
        val argument = builder.build()
        // 将参数Argument添加到NavGraph中以便Fragment使用
        graph.addArgument("arg", argument)
    }
}

XML布局文件:





2. 两个Fragment的代码 1. FirstFragment下的代码

Kotlin代码:

class FirstFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 获取此前在Activity中设置的NavGraph中的参数
        val map = findNavController().graph.arguments
        val argument = map["arg"]
        val bundle = argument?.defaultValue as Bundle
        // 获取Bundle中的值
        val text = bundle.getString("text", "")
        // 设置Button显示的文字
        mBtnSecond.text = text
        val secondBundle = Bundle()
        secondBundle.putString("second", "传递到下一个Fragment的值")
        // 跳转至第二个Fragment页面,并且传递参数
        mBtnSecond.setOnClickListener {
            findNavController().navigate(R.id.action_firstFragment_to_secondFragment, secondBundle)
        }

    }

}

XML布局代码:




    
2. SecondFragment下的代码

Kotlin代码:

class SecondFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_second, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 此处Fragment依然可以获取在Activity下设置的NavGraph中的值
        val map = findNavController().graph.arguments
        val activityArgument = map["arg"]
        val bundle = activityArgument?.defaultValue as Bundle
        val text = bundle.getString("text", "")
        println("这是从上层Activity中传递过来的值:${text}")
        // 此处获取从FirstFragment中传递的值
        val secondText = arguments?.getString("second", "")
        mBtnFirst.text = secondText
        mBtnFirst.setOnClickListener {
            // 点击返回上一层Fragment
            findNavController().navigate(R.id.action_secondFragment_pop)
        }
    }

}

XML布局代码:




    

    
三. 文件nav_graph.xml



    
        
    

    
        
    

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/992351.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存