Jetpack Architecture系列教程之(八)——Navigation导航

目录

介绍

和第三方框架比较

如何使用?

添加依赖

新建fragment

配置Navigation Graph

定义节点NavHost


介绍

        Navigation导航是指允许用户在应用内的不同内容中导航,导入和退出的交互。利用它我们能够更好的实现Fragment的管理,轻松实现单个Activity和多个Fragment的交互模式,这种交互模式其实也是一个APP最“科学”的形式。

和第三方框架比较

        类似的导航库其实在开源第三方项目中早已存在,例如优秀的Fragmentation和FragmentRigger,它们都趋向成熟且有一定规模。那么Navigation和它们相比又有什么优势?

首先,Navigation职责单一,目前来看仅对Fragment做导航管理(导航该页或回退该页)。 二是,Navigation的兼容性更好,能保障向上兼容性。 三是,Navigation的后续扩展性,从代码设计上可以看出,Navigation并非只为Fragment提供导航。

如何使用?

添加依赖
dependencies {
     
    ...

    def navigation_version = '2.1.0-beta02'
    implementation "androidx.navigation:navigation-runtime-ktx:$navigation_version"
    implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
    implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"
}
新建fragment
class ContactList : Fragment(){

    private lateinit var datas : MutableList>

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        datas = arrayListOf()

        initData()//...

        val view = inflater.inflate(R.layout.fragment_contact, container, false)

        view.findViewById(R.id.rl_contact).adapter = ContactAdapter(activity!!.applicationContext,datas)

        return view

    }

}


class ContactAdapter(private var context: Context,private var datas: MutableList>) : RecyclerView.Adapter() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContactHolder {
        val view = LayoutInflater.from(context).inflate(R.layout.view_contact_list_item,null)
        return ContactHolder(view)
    }

    override fun getItemCount(): Int {
        return datas.size
    }

    override fun onBindViewHolder(holder: ContactHolder, position: Int) {
        val mapData = datas[position]
        holder.itemView.iv_head_icon.setImageResource((mapData["icon"] ?: error("")).toInt())
        holder.itemView.tv_name.text = mapData["name"]
        holder.itemView.rl_layout.setOnClickListener {
            val builder = Bundle()
            builder.putString("phone",mapData["phone"])
            builder.putString("name", mapData["name"])
            Navigation.findNavController(holder.itemView).navigate(R.id.action_contactList_to_contactMessage,builder)
        }
    }

    class ContactHolder(itemView: View): RecyclerView.ViewHolder(itemView)

}
class ContactMessage : Fragment(){

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val view = inflater.inflate(R.layout.fragment_contact_msg, container, false)

        val phone = arguments?.getString("phone") ?: "null"
        val name = arguments?.getString("name") ?: "null"
        view.findViewById(R.id.tv_about).text = name

        view.findViewById
配置Navigation Graph

res目录下新建navigation目录,并创建导航结构图nav_graph.xml

其中,action是导航行为,可以被NavController所指定调用。argument是携带参数,可以单独配置。




    
        
    

     
        

        
    

    //...

定义节点NavHost

设置app:defaultNavHost=”true”和导航目录加载于指定fragment之上




    

    

携带Bundle的导航行为

val builder = Bundle()
    builder.putString("phone",mapData["phone"])
    builder.putString("name", mapData["name"])
    Navigation.findNavController(view).navigate(R.id.action_contactList_to_contactMessage,builder)

导航回退行为

Navigation.findNavController(view).popBackStack()

你可能感兴趣的:(Jetpack,Architecture教程,android,jetpack)